web-dev-qa-db-ja.com

シャットダウンフックがEclipseで機能しない

shutdown hook を追加しました:

Runtime.getRuntime().addShutdownHook(myShutdownHook);

正常に動作しますが、Eclipseの赤い停止ボタンをクリックすると動作しません。 Eclipseでシャットダウンフックを呼び出す方法はありますか?

26
urir

赤い停止ボタンは、アプリケーションを強制的に強制終了します。つまり、正常に終了しないため、JVMはアプリケーションが終了していることを認識しないため、シャットダウンフックは呼び出されません。

残念ながら、フックが常に呼び出されることを保証するメカニズムを提供する方法は(少なくともWindowsでは)ありません。呼び出される可能性があるものですが、保証はありません。

17
Zoltán

私は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回クリックすると強制終了されます。

8
Marek Jagielski

私はパーティーに少し遅れていることを知っていますが、このスレッドが助けを求めているのを見つけました。おそらく他の人もそうするでしょう。

同じ問題が発生し、 Eclipseプラグイン (Linuxの場合)で解決しました。これにより、追加の停止ボタンが提供されるようになりました。これが皆さんのお役に立てば幸いです。

1
Christoph142

赤い停止ボタンはアプリケーションを終了するだけであり、Eclipse開発者によると、それについては何もできません。Eclipseバグトラッカーでこれを参照してください issue

0
Mubashar

@Pacerier-Javadocから:まれに、仮想マシンが異常終了する場合があります。つまり、完全にシャットダウンせずに実行を停止します。これは、仮想マシンが外部で終了した場合、たとえば、UnixのSIGKILLシグナルまたはMicrosoft WindowsのTerminateProcess呼び出しで発生します。また、内部データ構造が破損したり、存在しないメモリにアクセスしようとしたりして、ネイティブメソッドが失敗した場合にも、仮想マシンが異常終了する可能性があります。仮想マシンが異常終了した場合、シャットダウンフックが実行されるかどうかについて保証することはできません。

0
user2088211