Ключ завершения работы не работает в Eclipse
Я добавил завершение загрузки через:
Runtime.getRuntime().addShutdownHook(myShutdownHook);
Он нормально работает нормально, но не тогда, когда я нажимаю кнопку красной остановки в Eclipse. Есть ли способ заставить крюк остановки вызывать в Eclipse?
Ответы
Ответ 1
Красная кнопка остановки принудительно убивает приложение, то есть не изящно, поэтому JVM не знает, что приложение выходит из строя, поэтому крючки отключения не вызываются.
К сожалению, нет способа (в Windows, по крайней мере) предоставить механизм, который гарантирует, что hook всегда вызывается. Это просто то, что может быть вызвано, но нет гарантии.
Ответ 2
Я сделал взлом, заменив 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();
}}
Сначала нажмите на красную кнопку, я отправлю сообщение в заявку с просьбой о мягком завершении. Если он не работает, второй щелчок на красной кнопке убьет его.
Ответ 3
Невозможно обойти проблему, используя:
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
Ответ 4
Я знаю, что немного опаздываю на вечеринку, но я нашел эту нить, ищущую помощь, и, возможно, другие.
У нас была такая же проблема и она была решена с помощью плагина Eclipse (в Linux), который теперь предоставляет дополнительные кнопки остановки.
Надеюсь, это послужит вам всем, а также поможет нам:)
Ответ 5
Красная кнопка остановки просто завершает работу приложения, и, согласно разработчикам eclipse, они ничего не могут с этим поделать, посмотрите эту проблему в eclipse bug tracker.
Ответ 6
@Pacerier - из Javadoc: в редких случаях виртуальная машина может прервать работу, то есть прекратить работу, не закрывая ее полностью. Это происходит, когда виртуальная машина завершается извне, например, с сигналом SIGKILL в Unix или вызовом TerminateProcess в Microsoft Windows. Кроме того, виртуальная машина может прервать работу, если родной метод пойдет наперекосяк, например, повреждая внутренние структуры данных или пытаясь получить доступ к несуществующей памяти. Если виртуальная машина прерывается, тогда не может быть никакой гарантии о том, будут ли выполняться какие-либо выключения.
Ответ 7
Если вы просто хотите проверить, работает ли крючок или нет, throw new RuntimeException()
из точки запуска. Это должно вызывать крюк остановки даже из Eclipse.