Уважает ли Websphere потоки Daemon? - PullRequest
4 голосов
/ 14 февраля 2012

У меня есть приложение, которое создает загрузку потоков Daemon, я бы хотел, чтобы каждый из них закрывался при закрытии приложения.

Я немного обеспокоен, что Websphere 7 можетне стоит их закрывать.

Кто-нибудь знает, как Websphere 7 по-разному относится к потокам демонов?(Я знаю, что так и должно быть)

Примечание: я знаю, что не должно создавать потоки вручную, и что мне, вероятно, следует использовать WebSphere WorkManager или что-то еще, но это приложение должно работать в Tomcat и WebSphere.

Я знаю, что мне нужно связать все потоки с каким-то механизмом контекста / завершения работы, это выполняется.

Ответы [ 3 ]

4 голосов
/ 14 февраля 2012

Каждый WAS-сервер запускает одну JVM, а потоки демона привязаны к жизненному циклу JVM, а не к жизненному циклу приложения.Поэтому не следует ожидать, что какие-либо потоки демона будут закрыты при остановке приложения.

Как вы уже указали, вам не следует создавать потоки вручную;спецификации Java EE запрещают это, и поведение в контейнере Java EE отличается от отдельного приложения Java, как вы уже нашли.К сожалению, в настоящее время не существует стандарта Java EE для эквивалента WorkManager;однако JSR-236 (Утилиты параллелизма для Java EE) могут вернуться в качестве кандидата для включения в Java EE 7 .

Тем временем на WAS,Вы можете использовать асинхронные компоненты (WorkManager).Мы успешно использовали этот метод, чтобы связать потоки с жизненным циклом приложения.

Однако, поскольку вам также нужно работать в другом контейнере (Tomcat), могут быть некоторые другие варианты, которые следует учитывать при обработке параллелизма в ваших приложениях:

Некоторые другие потенциальные варианты обработки параллелизма включают в себя следующие, но для них требуются EJB, которые могут быть недоступны в Tomcat:

  • EJB 3.0 Служба таймера
  • EJB 3.1 Асинхронные компоненты

Вот несколько связанных тем на тему параллелизма в Java EE:

1 голос
/ 14 февраля 2012

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

Этот подход требует централизованного создания потока и использования слушателя для завершения потоков, когда приложение останавливается.

Вам придется сделать несколько вещей:

  1. Централизует создание всех потоков в одном классе (назовите его ThreadService). Когда поток создается здесь, поместите его в список, чтобы позже можно было перебрать список, чтобы остановить их все.
  2. Создайте интерфейс, реализованный вашими потоками, который позволит вам останавливать каждый поток через один и тот же интерфейс. Каждый поток, который у вас есть, должен реализовать свой собственный механизм для обработки этого. Например, если ваш поток использует цикл и Thread.sleep (), тогда установите stop = true и прервите поток. Цикл должен проверить это и выйти из цикла, когда остановлено = true.
  3. Сделать слушателя и реализовать ServletContextListener. Когда contextDestroyed () вызывается, вызывается ThreadService.stopThreads (). Зарегистрируйте этого слушателя в web.xml.
0 голосов
/ 14 февраля 2012

Websphere - это просто Java-приложение.Он не может уважать или не уважать потоки deamon, которые являются особенностью JVM или среды выполнения Java.Итак, если вы создадите поток deamon внутри приложения Java EE, он будет использоваться на каждом сервере приложений.

Более того, насколько мне известно, даже если вы создадите обычный поток, это не помешает завершению работы сервера приложений: механизм выключения каждого сервера приложений пытается закрыть все его компоненты и в конце запускает System.exit(), чтобыпобедить преступников :) которые открывают темы вручную.

...