о программе завершения Java - PullRequest
1 голос
/ 03 января 2012

У меня есть проект, который должен работать вечно под Unix. Но в случае, если нам нужно остановить это, я думаю о написании программы завершения, чтобы закрыть ее изящно. У меня нет опыта в написании такой программы. Может ли кто-нибудь дать мне подсказку? Есть ли какая-либо схема перехвата сигнала в Java? Спасибо

Ответы [ 4 ]

2 голосов
/ 03 января 2012

Вам нужно добавить отключение отключения в ваше приложение.Это поток, который будет запущен, когда ваша программа завершится нормально или если JVM завершится в ответ на пользовательское прерывание, сигнал SIGTERM или общесистемное событие, такое как выход пользователя из системы или завершение работы системы.Посмотрите на javadocs для получения дополнительной информации.

Вот шаги, выполняемые при создании ловушек отключения:

1) Создайте класс ловушек отключения:

public class AppShutdownHook extends Thread{
    public void run(){
        logger.info("Running shutdown hook...") ;
        //cleanup e.g. close database connections etc
    }
}

2) Зарегистрируйте ловушку отключения:

public class App{
    public App(){
        Runtime.getRuntime().addShutdownHook(new AppShutdownHook()) ;
    }
}

Прелесть этого подхода в том, что у вас нет специального «сценария остановки», который вам нужно помнить для запуска каждый раз, когда у вас естьчтобы остановить приложение или перезагрузить компьютер.

Ссылка: Завершение работы Java-приложений

1 голос
/ 03 января 2012

Здесь есть несколько вариантов.

Одним из них является то, что он может принимать вход командной строки, но для этого потребуется доступ к его входному потоку, что может не произойти, если вы закроете терминал и т. Д. Вероятно, лучший способ сделать это - использовать любой из них. сокет и заставить его слушать определенный поток, чтобы завершить работу. Ваша программа завершения будет нести ответственность за запись в этот сокет.

Другим вариантом будет использование какого-то более сложного IPC, такого как разделяемая память.

И, наконец, еще один вариант - использовать плоский файл, хранящийся где-то в системе, чтобы ваш процесс отслеживал изменения. Затем программа завершения запишет в этот файл.

0 голосов
/ 03 января 2012

Возможна обработка сигналов в java, но это функция, которая опирается на использование классов sun.misc. *, К которым следует подходить с осторожностью, поскольку они считаются внутренними классами и предметом смены между выпусками.

С этим предупреждением, проверьте эту ссылку для получения дополнительной информации: http://www.ibm.com/developerworks/ibm/library/i-signalhandling/#N102C8

Эта статья основана на Java 1.3.1, но механизм все еще присутствует и на солнце, и на IBM jvms 1.6.

Мне тоже интересно, возможно ли использовать jni и agentlib для установки собственного обработчика сигналов в ваш jvm ... Я никогда не пробовал и должен был бы изучить это.Возможно, у jvm уже есть обработка сигналов, которую нельзя переопределить.

0 голосов
/ 03 января 2012

Я вспомнил похожий вопрос , который задавали некоторое время назад.Одним из возможных направлений действий является использование SignalHandler .

. Вы можете прочитать полную статью здесь .Похоже, что это связано с IBM JVM, но я думаю, что это в равной степени справедливо и для горячей точки Java.

Малоизвестная особенность Java - способность приложения устанавливать собственный обработчик сигнала, которыйподдерживается через класс sun.misc.Signal.Тем не менее, соблюдайте осторожность при использовании классов из пакета sun.misc, поскольку он содержит недокументированные вспомогательные классы, которые могут меняться между выпусками Java.Вы можете установить обработчик Java для любого сигнала, который не используется JVM.Эти обработчики сигналов похожи на собственные обработчики, потому что они вызываются, когда генерируется собственный системный сигнал, но они всегда будут работать как отдельный поток Java.По сути, когда возникает сигнал, для которого доступен обработчик сигнала Java, «поток диспетчера сигналов» JVM пробуждается и получает информацию о сигнале.Затем поток диспетчера сигналов вызывает метод Java для создания и запуска нового потока для установленного обработчика сигналов Java.Чтобы написать обработчик сигнала Java, определите класс, который реализует интерфейс sun.misc.SignalHandler, и зарегистрируйте обработчик с помощью метода sun.misc.Signal.handle ().

Я также принимал участиев дискуссии на эту тему здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...