Есть ли какой-нибудь хук отключения, когда приложение «Принудительно закрыто»? - PullRequest
3 голосов
/ 02 ноября 2011

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

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

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

1 Ответ

6 голосов
/ 02 ноября 2011

Нет.

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

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

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

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

...