我通过以下方式添加了一个关闭挂钩:
Runtime.getRuntime().addShutdownHook(myShutdownHook);
通常情况下它正常工作,但当我在Eclipse中点击红色停止按钮时就不行了。有没有办法让关闭挂钩在Eclipse中被调用?
我通过以下方式添加了一个关闭挂钩:
Runtime.getRuntime().addShutdownHook(myShutdownHook);
通常情况下它正常工作,但当我在Eclipse中点击红色停止按钮时就不行了。有没有办法让关闭挂钩在Eclipse中被调用?
红色的停止按钮会强制终止应用程序,即不会优雅地关闭,因此JVM不知道应用程序正在退出,因此关闭挂钩(shutdown hooks)不会被调用。
不幸的是,在Windows中没有办法确保总是调用关闭挂钩的机制。这只是可能被调用的一些东西,但没有保证。
我通过将JavaProcess替换为装饰的进程来进行了黑客攻击:
IProcess p = launch.getProcesses()[0];
launch.addProcess(new JavaProcessDecorator(p));
launch.removeProcess(p);
装饰器正在覆盖终止函数。
public class JavaProcessDecorator implements IProcess {
private IProcess p;
public JavaProcessDecorator(IProcess p) {
this.p = p;
}
private boolean sigkill = false;
@SuppressWarnings("rawtypes")
@Override public Object getAdapter(Class arg) { return p.getAdapter(arg); }
...
@Override public ILaunch getLaunch() { return p.getLaunch(); }
@Override public IStreamsProxy getStreamsProxy() { return p.getStreamsProxy(); }
@Override public void setAttribute(String s1, String s2) { p.setAttribute(s1, s2); }
@Override public void terminate() throws DebugException {
if(!sigkill) {
try {
IDebugIService cs = DirmiServer.INSTANCE.getRemote("main", IDebugIService.class);
if(cs != null) cs.modelEvent(new TerminateRequest());
} catch (RemoteException e) { }
this.sigkill = true;
} else p.terminate();
}}
首先点击红色按钮,我向应用程序发送一条消息请求温和终止。如果这不奏效,第二次点击红色按钮将强制关闭它。
我知道自己来晚了,但我在寻求帮助时发现了这个帖子,其他人可能也会这样。
我们遇到了同样的问题,并通过一个 Eclipse 插件(在Linux上)解决了它,该插件现在提供了额外的停止按钮。希望这对你们所有人都有用,就像它帮助我们一样 :)
如果你只是想测试这个钩子是否起作用,可以从触发点throw new RuntimeException()
。即使在Eclipse中,这样也应该调用关闭钩子。