2014-01-27 2 views
0

Я сделал тест WebService, который запускает Thread, который записывает в файл timestamp каждые 10 секунд. У меня умышленно не существует механизма остановки потока. Теперь, если я остановлю тест WebService и даже удалю его, Thread будет жить в Jboss навсегда (требуется перезапуск JBoss). Это нормально, что JBoss не знает о потоках, созданных в контексте WebService?Jboss WS и Threads

В JVM, когда приложение отключается, все потоки убиты, но здесь JVM принадлежит Jboss, , который динамически загружает классы.

Это «особенность» или ошибка?

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

ответ

0

Очистка ресурсов, используемых WebService, является обязанностью самого WebService.

Tomcat поможет вам при регистрации предупреждений, когда WebService не делает это правильно (например, когда драйвер JDBC для MySQL покидает thread hanging), и это будет даже пытаться очистить ThreadLocals для вас (см также комментарии в this служебного класса) ,

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

0

Я сделал тест WebService, который запускает Thread, который записывает в файл timestamp каждые 10 секунд. У меня умышленно не существует механизма остановки потока. Теперь, если я остановлю тестовый WebService и даже удалю его, Thread будет жить в Jboss навсегда (требуется перезапуск JBoss). Это нормально, что JBoss не знает о потоках, созданных в контексте WebService?

Вы не должны запускать свои собственные потоки, поэтому JBoss не будет чистить ваши вещи для вас.

См. Также why spawning threads in Java EE is discouraged (в основном относится к Enterprise Java Beans) или "Java EE specification and multi threading".

Если стороннее приложение выполняет собственную потоковую обработку, и вы не можете его изменить, это может быть не очень хорошо подходит для сервера приложений. Старый трюк для переноса старого приложения в Java EE - это управление его жизненным циклом с использованием ServletContextListener, который имеет метод init и destroy.

Если вы можете его изменить, проверьте Concurrency Utils API example на вопрос/ответ, который я связал выше, используя ExecutorService - это современный способ управления потоками, чтобы сервер знал о вашей работе.

+0

Да, как я и предполагал. Это могло бы заставить механизацию регистрировать поток внутри JBoss каким-то образом. – Marvin

+0

@Marvin Вы [конечно можете] (https://community.jboss.org/wiki/ThreadPoolConfiguration), и я очень рекомендую: если вы остановите/начнете свои собственные потоки, произойдет фанки. Я успешно управлял потоками в JBoss 5.1 (для персонализированной службы) с помощью потоков JBoss. Без использования потока потока JBoss он не будет функционировать должным образом. – vanOekel

+0

Mine WS работает так, как должен, с собственным управлением потоковой обработкой, как в jvm (в конце концов, jboss - это просто «другое» приложение для Java :) Но поскольку его не новое программное обеспечение и логика в том, что потоки всегда живут с веб-сервисом контекст, они должны думать об этом также.Все в порядке со мной, что они пишут, ваши собственные, как вы справитесь, но чтобы сказать пользователям, чтобы они избегали потоков, это означает, что их веб-службы должны быть «hello world» одинаковыми: P – Marvin