Любой перехват завершения работы, когда приложение «принудительно закрыто»?

#java #process #shutdown-hook

#java #процесс #перехват завершения работы

Вопрос:

Есть ли какой-либо способ заставить программу пройти через перехват завершения работы, если пользователь принудительно закрывает java (через диспетчер задач или путем закрытия соответствующего пакетного файла).

В настоящее время моя программа запускается и выполняется хорошо, если пользователь закрывает графический интерфейс, он выполняет ряд шагов для отключения от базы данных. Однако, если пользователь закрывает Java или пакетный файл (работающий параллельно с графическим интерфейсом), соединение с базой данных не закрывается.

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

Ответ №1:

Нет.

Перехват завершения работы будет реагировать на Ctrl C, обычное закрытие, выход пользователя из системы и обычное завершение работы системы (которые запрашивают корректное завершение работы всех приложений).

Однако, если кто-то принудительно закрывает приложение, предполагается, что это то, чего вы на самом деле хотите — немедленное завершение без дальнейшего уведомления. Этот вопрос задавался много раз, и его смущает поведение многих приложений, которые, когда их просят принудительно закрыть, на самом деле требуют много времени для окончательного завершения. Это связано с тем, что в усилиях ОС по освобождению всех ресурсов некоторые ресурсы (особенно определенные ресурсы ввода-вывода и / или файлов) не отпускаются немедленно.

При тестировании приложения, которое запускается и должно выполняться до завершения работы (например, серверного программного обеспечения), вы должны запустить его в консоли / командной строке и нажать Ctrl C, чтобы остановить программу (которая запустит перехват завершения работы), а не использовать диспетчер задач или KILL -9.

Кроме того, Java ничего не могла бы с этим поделать, если бы захотела. Принудительное закрытие происходит на уровне ОС, после чего он освобождает используемые дескрипторы памяти, файлов и ввода-вывода и т.д. Java не имеет (как и любая другая программа) контроля над принудительным закрытием. На данный момент ответственность берет на себя ОС.

Комментарии:

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

2. 1 за указание на то, что завершение происходит на уровне операционной системы.

3. @Cody, ваш сервер базы данных должен закрыть соединение по истечении времени ожидания. Что касается любых временных или рабочих данных в базе данных, попробуйте использовать транзакции. Процесс мониторинга — это просто кроличья нора.

4. Вероятно, вы могли бы взломать что-то вместе (например, отслеживать список запущенных процессов и использовать завершение для запуска реакции), но я пытаюсь подчеркнуть, что принудительное закрытие является тупиковым. Попытка обойти или отреагировать на принудительное закрытие — это НЕ то, что вы хотите сделать. Это принудительное закрытие. Как и смерть, это часть жизни, и попытки бороться с ней приведут вас только к путям, которые пытаются бороться с тем, как должен выполняться жизненный цикл ОС / приложения. Большинство вопросов, которые задают этот вопрос, не полностью отражают эту реальность.

5. Единственное исключение из такого поведения, о котором я могу думать (могут быть и другие), — это системы мониторинга программного обеспечения / инфраструктуры, предназначенные для отслеживания принудительных закрытий / сбоев и выполнения некоторой автоматизированной задачи в результате (например, перезапуск служб, отправка уведомления администратору и т. Д.).).