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

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

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

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


person Cody    schedule 02.11.2011    source источник


Ответы (1)


Неа.

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

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

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

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

person jefflunt    schedule 02.11.2011
comment
Да, я это понимаю, но есть ли другой способ обеспечить это, через другую программу или что-то, что работает параллельно. Например, как вирусы, если принудительно закрыть, они просто снова откроются. Очевидно, я не делаю вирус, а просто закрываю базу данных перед выходом. - person Cody; 02.11.2011
comment
+1 за указание на то, что завершение происходит на уровне ОС. - person Tim Bender; 02.11.2011
comment
@ Коди, ваш сервер базы данных должен закрыть соединение по истечении тайм-аута. Что касается любых временных или рабочих данных в базе данных, попробуйте использовать транзакции. Мониторный процесс — это просто кроличья нора. - person Tim Bender; 02.11.2011
comment
Возможно, вы могли бы совместить что-то (например, отслеживание списка запущенных процессов и использование завершения для запуска реакции), но я пытаюсь подчеркнуть, что по замыслу принудительное закрытие - это тупик. Попытка обойти или отреагировать на принудительное закрытие — это НЕ то, что вы хотите делать. Это сила рядом. Подобно смерти, это часть жизни, и попытки бороться с ней приведут вас только к пути, который пытается бороться против того, как должен проходить жизненный цикл ОС/приложения. Большинство вопросов, которые задают это, не полностью понимают эту реальность. - person jefflunt; 02.11.2011
comment
Единственным исключением из такого поведения, о котором я могу думать (могут быть и другие), являются системы мониторинга программного обеспечения/инфраструктуры, предназначенные для наблюдения за принудительным закрытием/сбоем и в результате выполнения некоторых автоматизированных задач (например, перезапуск служб, отправка уведомления на админ и др.). - person jefflunt; 02.11.2011
comment
ну в том смысле, что это идея, но если пользователь входит в свою сессию через программу, и он не удаляется из списка вошедших в систему пользователей, он не сможет повторно войти в систему, пока его имя не будет удалено вручную . (Вот как работает моя программа) - person Cody; 02.11.2011
comment
Хм, я поддерживал банковское приложение, которое имело похожий функционал. Идея в этом случае заключалась в том, чтобы предотвратить возможность входа одной и той же учетной записи пользователя с нескольких станций (в данном случае с кассовых станций). В случае с этим приложением, поскольку оно считалось мерой безопасности, пользователям просто приходилось иметь дело с тем, чтобы не забыть выйти из системы, или им приходилось вызывать администратора, чтобы заставить их выйти. т.е. банк возложил бремя выполнения правильных действий на пользователя. - person jefflunt; 02.11.2011