Приложение Java Swing не завершит работу после получения сигнала TERM - PullRequest
2 голосов
/ 30 марта 2010

У меня есть приложение Java Swing, которое используется в качестве кластерного приложения. Проблема в том, что каждый раз, когда кластер пытается завершить работу Java-приложения, он просто зависает, и Windows отображает диалоговое окно «Завершить сейчас». Указанное приложение относится к типу сервера, поэтому при каждой попытке подключения к нему создается поток.

Я узнал, что кластер отправляет сигнал TERM с помощью программы, представленной в этой статье. НО, когда консольное приложение используется в качестве кластерного приложения, кластер может просто завершить процесс после нескольких сигналов TERM.

Я также попробовал пример настольного приложения vanilla, которое доступно при создании нового проекта с использованием NetBeans 6.8. Он также не прекратится даже после получения сигнала.

Из демонстраций, сделанных выше, я думаю, что это как-то связано с Swing или с потоками. Кто-нибудь может мне с этим помочь? Спасибо.

РЕДАКТИРОВАТЬ: Это может быть убит с помощью диспетчера задач, хотя я думаю, что он посылает другой сигнал.

1 Ответ

2 голосов
/ 30 марта 2010

Когда ваше Java-приложение получит сигнал TERM, оно выполнит все зарегистрированные перехватчики перед завершением работы. Одна из возможностей заключается в том, что один из этих отключающих хуков блокируется на неопределенный срок или же для его выполнения требуется длительное время (> 30 секунд), что приводит к отображению диалогового окна Windows «Конец сейчас».

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

...