Отключение крюка не работает в Eclipse
Я добавил хук отключения через:
Runtime.getRuntime().addShutdownHook(myShutdownHook);
Он работает нормально, но не тогда, когда я нажимаю красную кнопку остановки в Eclipse. Есть ли способ сделать так, чтобы в Eclipse вызывался хук отключения?
7 ответов
Красная кнопка остановки принудительно убивает приложение, то есть не изящно, поэтому 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();
}}
При первом нажатии на красную кнопку я отправляю сообщение в приложение с просьбой аккуратно расторгнуть. Если он не работает, второе нажатие на красную кнопку убьет его.
Вы не можете обойти проблему, используя:
if (Boolean.parseBoolean(System.getenv("RUNNING_IN_ECLIPSE")) == true) {
System.out.println("You're using Eclipse; click in this console and " +
"press ENTER to call System.exit() and run the shutdown routine.");
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.exit(0);
}
Пожалуйста, обратитесь к разделу: Как заставить отключение завершить выполнение процесса, запущенного из Eclipse
Я знаю, что немного опоздал на вечеринку, но я нашел эту ветку в поисках помощи, как и другие.
У нас была такая же проблема, и мы решили ее с помощью плагина Eclipse (в Linux), который теперь предоставляет дополнительные кнопки остановки. Я надеюсь, что это служит всем вам, а также помогло нам:)
Красная кнопка остановки просто завершает работу приложения, и, согласно разработчикам eclipse, они ничего не могут с этим поделать, см. Эту проблему в программе отслеживания ошибок eclipse.
@Pacerier - из Javadoc: В редких случаях виртуальная машина может прервать работу, то есть прекратить работу без выключения полностью. Это происходит, когда виртуальная машина завершается извне, например, с помощью сигнала SIGKILL в Unix или вызова TerminateProcess в Microsoft Windows. Виртуальная машина также может прервать работу, если собственный метод не работает, например, из-за повреждения внутренних структур данных или попытки доступа к несуществующей памяти. Если виртуальная машина прерывает работу, то нельзя гарантировать, будут ли запущены какие-либо перехватчики завершения работы.
Если вы просто хотите проверить, работает ли крючок или нет, throw new RuntimeException()
от триггерной точки. Это должно вызывать отключение даже из Eclipse.