Отключение крюка не работает в 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.

Другие вопросы по тегам