Отправка сигналов работающей JVM - PullRequest
8 голосов
/ 17 февраля 2011

Я использую собственный обработчик сигналов для перехвата сигналов TERM, ABRT и INT в пользовательском демоне java.У меня есть этот обработчик в коде, так что я могу отправлять ему сигналы TERM и корректно завершать работу программы с помощью команды kill.Обработчик сигнала работает прямо сейчас, но когда я компилирую код, я получаю следующее предупреждение (многократно):

предупреждение: sun.misc.SignalHandler - собственный API Sunможет быть удален в будущем выпуске

при использовании этих классов:

import sun.misc.SignalHandler;
import sun.misc.Signal;

Есть ли лучший способ отправить сигналы работающей JVM, чтобы инициировать отключениеосновной поток?Мне не нравится привязывать мой код к этому API, когда он может быть удален в будущем.

Этот код работает сегодня на Solaris и HPUX с использованием 1.5.0_22 JVM.Любая помощь или предложения будут высоко оценены.Я использовал этот документ от IBM для разработки обработчика сигнала:

http://www.ibm.com/developerworks/java/library/i-signalhandling/

Ответы [ 2 ]

17 голосов
/ 17 февраля 2011

Прежде всего, поймите, что это стандартное предупреждение для пакета sun.misc. Они сообщают вам, что используемый вами API не является стандартным Java API. Это не значит, что они активно планируют удалить этот API в будущем. http://java.sun.com/products/jdk/faq/faq-sun-packages.html

Что касается вашего вопроса, мне не совсем понятно, почему для вас недостаточно способа, которым java-процесс обрабатывает сигналы уничтожения по умолчанию: Как правильно остановить процесс java? . Если вам нужно добавить дополнительную логику, вы можете добавить ловушку отключения .

Тем не менее, если вы ищете другие способы сообщить вашему java-процессу, что пора завершать работу, вы можете прослушивать его через сокет, или stdin, или именованный канал ...

Возможно, вы захотите взглянуть на JVMTI

3 голосов
/ 17 февраля 2011

Вы можете сделать это через JMX. JMX - это стандартный набор API-интерфейсов, который можно использовать для мониторинга и управления Java-приложениями.

Вот несколько ссылок для начала:

http://onjava.com/pub/a/onjava/2004/09/29/tigerjmx.html

http://www.ibm.com/developerworks/java/library/j-jtp09196/index.html?ca=drs

Основная идея такова:

a) У вас будет логическая переменная, скажем, isShutDownTrigerred. У вас будет поток, который будет выполнять бесконечный цикл, спать в течение 2 секунд и постоянно проверять значение этой переменной. Когда значение равно true, вы выполните код, который закроет приложение.

б) Затем вы пишете mxbean (проверьте ссылки выше). Этот mxbean будет использован для изменения значения isShutDownTrigerred на true. Вы можете использовать такой инструмент, как jconsole / jManage, чтобы увидеть и изменить mxbeans java-приложения. Как только для «isShutDownTriggered» установлено значение «истина», вышеуказанный поток узнает его и выполнит завершение работы приложения

...