次の方法でシャットダウンフックを追加しました。
Runtime.getRuntime().addShutdownHook(myShutdownHook);
通常は正常に動作しますが、Eclipse で赤い停止ボタンをクリックすると動作しません。Eclipse でシャットダウン フックを呼び出す方法はありますか?
次の方法でシャットダウンフックを追加しました。
Runtime.getRuntime().addShutdownHook(myShutdownHook);
通常は正常に動作しますが、Eclipse で赤い停止ボタンをクリックすると動作しません。Eclipse でシャットダウン フックを呼び出す方法はありますか?
赤い停止ボタンは、アプリケーションを強制的に強制終了します。つまり、正常にではなく、JVM はアプリケーションが終了していることを認識しないため、シャットダウン フックは呼び出されません。
残念ながら、(少なくとも 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();
}}
最初に赤いボタンをクリックすると、穏やかな終了を求めるメッセージがアプリケーションに送信されます。機能していない場合は、赤いボタンを 2 回クリックすると強制終了します。
赤い停止ボタンはアプリケーションを終了するだけであり、Eclipse 開発者によると、Eclipse バグトラッカーでこの問題を参照してください。
@Pacerier - Javadoc から: まれに、仮想マシンが異常終了する場合があります。つまり、正常にシャットダウンせずに実行を停止する場合があります。これは、仮想マシンが外部で終了した場合に発生します。たとえば、Unix の SIGKILL シグナルや Microsoft Windows の TerminateProcess 呼び出しによって発生します。たとえば、内部データ構造が破損したり、存在しないメモリにアクセスしようとしたりして、ネイティブ メソッドが失敗した場合にも、仮想マシンは中止される可能性があります。仮想マシンが異常終了した場合、シャットダウン フックが実行されるかどうかは保証されません。
フックが機能しているかどうかをテストしたい場合はthrow new RuntimeException()
、トリガーポイントから。これにより、Eclipse からでもシャットダウン フックが呼び出されるはずです。