2011-01-27 5 views
0

Я использую сервер websphere. У меня есть сервлет, который действует как процессор запросов. Поскольку запрос выполняется для (много) фоновой обработки, мне нужно просто создать поток, который будет выполнять все эти фоновые задания. В то же время мой процессор запросов должен вернуться после запуска этого потока. То, что я нахожу из поиска журнала, - это как только мой процессор запросов вернется, поток фоновой обработки также, похоже, выходит, поскольку он не дает никаких сообщений журнала. Я попытался сделать фоновый поток демонами один, но снова он не оставляет сообщений журнала. Разве поток обработчика запросов, который запускается websphere, не остается в пуле потоков навсегда? В таком случае не должен ли мой фоновый поток работать? Даже если процессор запросов умирает, разве это не означает, что фоновый поток является потоком демона, он должен продолжать выполнять? Просьба уточнить. Если есть какие-то недостатки в моем понимании того, как websphere управляет своими потоками. Пожалуйста, помогите мне понять это.Сохранение потока дочерних потоков

EDIT: Проблема была solved.Actually это был мой bad.I был сдерживая HttpServletRequest объект для работы с использованием в фоновом режиме thread.But так или иначе он разрушается после того, как запрос вернулся из сервлета. Таким образом, в моем фоновом потоке было исключение из null-указателя, и оно было завершено. Мне все же нужно выяснить жизненный цикл объекта HttpServletRequest и когда он точно уничтожен. Если вы можете помочь мне понять это, я буду благодарен. Спасибо в любом случае!

EDIT: Добавление, что Servlets specification должен сказать об этом: Каждый объект запроса является действительным только в пределах метода обслуживания сервлета или в рамках метода doFilter фильтра, если не асинхронной обработки для компонента, и метод startAsync вызывается по запросу объект. В случае, когда происходит асинхронная обработка, объект запроса остается действительным до тех пор, пока полное завершение не будет вызвано в AsyncContext. Контейнеры обычно перерабатывают запрашивают объекты, чтобы избежать служебных затрат на объект запроса . Разработчик должен знать, что поддержка ссылок на объекты запроса , для которых startAsync не вызывается за пределами области действия, описанной выше, не рекомендуется , так как она может иметь неопределенные результаты.

+1

Вы называете 'Thread.start()'? Пробовали ли вы использовать JVisualVM для наблюдения за состояниями Thread? –

+0

Да, я использую Thread.start(). Я понятия не имею о JVisualVM. – mawia

+0

Оберните метод 'run()' вашей нити в исключениях try-catch и журналов, возможно, даже Error - потому что иначе вы не увидите ошибку. Это относится ко многим пулам потоков, исполнителям и тому подобным. –

ответ

1

Не работает ли поток обработчиков запросов, который запускается websphere, в пуле потоков навсегда?

Большинство экземпляров ThreadPoolExecutor позволяют потокам умирать после некоторого длительного простоя. Это, конечно, необязательно, и я не уверен, как websphere управляет своими рабочими потоками. Тем не менее, потоки не зависят от потоков, которые порождают их, чтобы сохранить их в живых. Темы - это объекты, которые поддерживают JVM в живых, и каждый из них независим.

В этом случае моя фоновая нить не должна работать? Даже если процессор запросов умирает, разве это не означает, что фоновый поток является потоком демона, он должен продолжать выполнять?

Создание демона Thread служит только для информирования JVM о том, что он может выйти, если этот поток все еще жив. JVM будет продолжать выполнение до тех пор, пока все потоки не-демона не будут завершены. В вашем случае это не влияет на проблему, так как websphere не просто выйдет, не сказав об отключении. В общем, сделать демон Thread является полная противоположность тому, что вы хотите. Вы хотите, чтобы ожидание этой нити поддерживало вашу JVM.

Конечно, ни один из этих ответов не позволяет решить вашу проблему. Помог бы фрагмент кода того, как вы создаете и запускаете Thread. Многие люди будут предлагать вам использовать ExecutorService вместо создания новых тем.

0

В прошлом я использовал Quartz для создания «неблокирующего рабочего потока» при ответе на HTTPRequest.

Вы можете передать работу в Quartz-thread/job и вернуть ответ, а затем взаимодействовать с Quartz-thread/job во время последующих запросов.

Вы можете скачать и узнать больше о Quartz Scheduler here

Вы можете упростить этот процесс, используя Spring абстракцию.
Для получения информации ознакомьтесь с весенней документацией по планированию.

Надеюсь, это поможет - сообщите мне, если вам нужно дальнейшее направление.

1

Создание потоков в j2ee контейнер обескуражен, см: Why spawning threads in J2EE container is discouraged?

С Websphere вы можете использовать либо Асинхронные Фасоль и WorkManager, или вы можете использовать JMS и MDB, чтобы сделать работу.

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