Это не та вещь, для которой предназначен контейнер сервлетов. Вам действительно нужен более полноценный сервер приложений J2EE, если вы собираетесь использовать стандартизированный подход. В противном случае вы получите хаки, но их может быть достаточно для вашей задачи.
Вероятно, я бы попробовал создать DaemonServlet. Это просто обычный сервлет, который не сопоставляется с URL-адресом (за исключением, возможно, скрытого URL-адреса для целей мониторинга, хотя для такого рода вещей предпочтительнее использовать JMX). Метод init()
вызывается при загрузке сервлета. Вы можете начать тему в этом. Возможно, вам может понадобиться создать два: один, который делает работу. Другой проверяет, работает ли первый, и корректно завершает его после вызова destroy()
.
В качестве альтернативы, если вы используете Spring (и, скажем прямо, что за хрень не использует Spring?), Вы можете просто создать бин в контексте приложения, который делает много то же самое, за исключением событий жизненного цикла Spring (например, afterPropertiesSet () в InitializingBean).
На самом деле, у меня есть еще лучшее предложение. Используйте пользователей асинхронных сообщений , которые будут намного чище и более масштабируемыми, но это основано на JMS решении, а не просто LinkedBlockingQueue
(а JMS, вероятно, является В любом случае, идея получше). Однако в зависимости от ваших ограничений JMS может быть недоступен в качестве опции.