Java 关闭挂钩不';我不能在Eclipse中工作

Java 关闭挂钩不';我不能在Eclipse中工作,java,eclipse,shutdown-hook,Java,Eclipse,Shutdown Hook,我添加了一个via: 它正常工作,但当我在Eclipse中单击红色的停止按钮时就不行了。有没有办法让关闭钩子在Eclipse中被调用?红色的停止按钮会强制终止应用程序,也就是说,不正常,因此JVM不知道应用程序正在退出,因此不会调用关闭钩子 不幸的是,没有办法(至少在Windows中)提供一种机制来确保钩子总是被调用。这只是一些可以调用的东西,但不能保证。红色停止按钮只是终止应用程序,根据eclipse开发人员的说法,他们对此无能为力。请参见eclipse bug tracker中的这一点 @P

我添加了一个via:


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

红色的停止按钮会强制终止应用程序,也就是说,不正常,因此JVM不知道应用程序正在退出,因此不会调用关闭钩子


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

红色停止按钮只是终止应用程序,根据eclipse开发人员的说法,他们对此无能为力。请参见eclipse bug tracker中的这一点

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

我通过将JavaProcess替换为已修饰的进程进行了攻击:

    IProcess p = launch.getProcesses()[0];
    launch.addProcess(new JavaProcessDecorator(p));
    launch.removeProcess(p);
并且decorator重写终止函数

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();
}}

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

如果您只想测试钩子是否工作,
从触发点抛出新的RuntimeException()
。即使是在Eclipse中,这也应该调用关闭挂钩。

我知道我参加聚会有点晚,但我发现这条线程正在寻求帮助,其他人也可能会这样

我们也遇到了同样的问题,并通过(在Linux上)提供额外的停止按钮解决了这个问题。
我希望这能为大家服务,也能为我们提供帮助:)

请引用一个消息来源,引用“无法提供确保钩子始终被调用的机制”,因为页面明确指出钩子将在“程序正常退出”或“虚拟机因应用户/系统中断而终止”时运行@Pacerier该语句基于我所做的一个测试,我关闭了一个控制台窗口,该窗口正在运行一个调用Java应用程序的批处理脚本。关闭窗口时,未调用关闭挂钩。这和从Eclipse停止应用程序都是程序无法正常退出的示例。这些问题标记为重复两年后提出的问题,而另一个问题是两年前提出的(09而不是11)。您可能误读了一年中的第13天。可以通过Eclipse Marketplace的帮助菜单轻松安装(该链接包含手动下载和安装的说明,我发现了一些错误)
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();
}}