关闭挂钩在Eclipse中不起作用

时间:2012-10-11 09:37:02

标签: java eclipse shutdown-hook

我已经通过以下网址添加了shutdown hook

Runtime.getRuntime().addShutdownHook(myShutdownHook);

它正常工作正常,但是当我单击Eclipse中的红色停止按钮时却没有。有没有办法在Eclipse中调用关闭钩子?

6 个答案:

答案 0 :(得分:15)

红色停止按钮强行杀死应用程序,即不正常,因此JVM不知道应用程序正在退出,因此不会调用关闭挂钩。

不幸的是,没有办法(至少在Windows中)提供一种机制来确保始终调用钩子。这只是可以调用的东西,但不能保证。

答案 1 :(得分:8)

我通过将装饰的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();
}}

首先点击红色按钮,我向应用程序发送一条消息,要求轻轻终止。如果它不起作用,第二次点击红色按钮将杀死它。

答案 2 :(得分:1)

我知道我参加聚会有点晚了,但我发现这个帖子寻求帮助,其他人也可能会帮忙。

我们遇到了同样的问题并使用Eclipse plugin(在Linux上)解决了它,现在提供了额外的停止按钮。 我希望这能为你们所有人服务,并且它确实帮助了我们:)

答案 3 :(得分:0)

红色停止按钮只是终止应用程序,根据eclipse开发者,他们无法做任何事情,请参阅eclipse错误跟踪器中的issue

答案 4 :(得分:0)

@Pacerier - 来自Javadoc:在极少数情况下,虚拟机可能会中止,即停止运行而不会干净地关闭。当虚拟机在外部终止时会发生这种情况,例如Unix上的SIGKILL信号或Microsoft Windows上的TerminateProcess调用。如果本机方法因例如破坏内部数据结构或尝试访问不存在的内存而出错,则虚拟机也可能中止。如果虚拟机中止,则无法保证是否将运行任何关闭挂钩。

答案 5 :(得分:-1)

如果您只想测试钩子是否正常工作,请从触发点开始throw new RuntimeException()。这应该甚至可以从Eclipse调用shutdown钩子。