2010-07-23 2 views
2

Мне нужно закрыть некоторые потоки, когда мое приложение Java EE не развернуто, чтобы избежать страниц исключений в server.log при каждом разворачивании. Исключения говорят: «Входной поток был завершен или принудительно закрыт без явного закрытия». Я знаю, как закрыть (с методом close()), но я не знаю, когда.Как узнать, когда приложение Java EE не развернуто?

finallize() приходит слишком поздно, @PreDestroy вызывается не только перед развёртыванием, но и в нормальном режиме работы. Как приложение знает, когда оно не развернуто?

Edit: Я называю это во время создания:

decisionLogger = KnowledgeRuntimeLoggerFactory.newThreadedFileLogger(
    ksession, 
    config.getString("rules.logfilename"), 
    config.getInt("rules.loginterval")); 

decisionLogger имеет тип KnowledgeRuntimeLogger, который имеет метод только близко(). Отсутствует геттер для потока, который работает под капотом. Чтобы закрыть его мягко, мне нужно вызвать метод close, но когда?

+0

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

+0

Я использую Glassfish 2.1. Как вы можете подключиться к функции undeploy? Проглатывание Исключения не является вариантом, потому что у меня нет доступа к потоку, который их бросает. Он скрыт в реализации Drools. – Arne

ответ

2

Добавить метод finalize() в регистратор или в зависимости от того, какой класс вызывает проблемы. Закройте потоки из этого. Если вы не выйдете с System.exit(), он будет запущен. Если вы вызываете System.exit, вы можете использовать Runtime.addShutdownHook

+0

Я использую регистратор времени выполнения Drools. Я не могу изменить это, и я не могу подклассифицировать его, потому что я получаю его с фабрики, которая также является частью среды выполнения Drools. И закрытие его в методе finalize объекта, который его использует, приходит слишком поздно. Тогда я получаю исключения. – Arne

+0

смотрите http://www.mckoi.com/database/maillist/msg00374.html. Он получает основы того, что вы можете сделать. Создайте метод, который регистрируется с помощью Runtime.addShutDownHook, и таким образом, когда время выполнения остановится, оно будет выполнено. –

+0

Я пробовал это и обнаружил, что он не работает в среде JEE, поскольку JVM не отключается, когда приложение не развернуто. ShutdownHook никогда не вызывается, когда я отказываюсь от развертывания. – Arne

3

Нет жестких и быстрых ответов, поскольку Java EE включает в себя множество технологий с переменными жизненными циклами.

Но я собираюсь взять удар в темноте и предложить вам посмотреть ServletContextListener. Это скажет вам, когда ваше веб-приложение остановлено, что, вероятно, является временем, когда вы хотите освободить ресурсы, а не при удалении приложения.

+0

К сожалению, у меня нет веб-модуля в этом приложении. Это просто чистая бизнес-логика. Тема JMS в качестве входных данных, механизм правил и почтовый сервер в качестве вывода. Еще больше оснований включать хорошие возможности ведения журнала, но это именно то, где выбрасываются Исключения. Когда логгер уничтожается во время разворота. – Arne

Смежные вопросы