Создание потоков веб-приложения, которое развертывается в Tomcat - PullRequest
6 голосов
/ 23 марта 2011

Я работаю над веб-приложением, которое развернуто в Tomcat. Мы используем Spring, Hibernate, GWT на стороне клиента).

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

Механизм оповещения в идеале должен быть асинхронным, и это должно влиять на производительность операции CRUD.

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

Может кто-нибудь посоветовать / предложить - это правильный способ сделать это? или есть лучшие способы сделать то же самое.

Любые указатели будут высоко оценены.

Заранее спасибо, Сэчин

Ответы [ 4 ]

7 голосов
/ 23 марта 2011

Ограничение на создание потоков в контейнере на самом деле было просто предложением не дать неопытным разработчикам не застрелить себя. Ни один контейнер на самом деле не запрещает вам делать это. С классами java.util.concurrent создание потоков должно быть менее подвержено ошибкам, и я бы не стал слишком беспокоиться об этом ограничении.

Если ваши требования просты, достаточно просто создать один поток / runnable в ServletContextListener. Создайте и запустите поток в contextInitialized() и закройте его в contextDestroyed(). , Используйте ScheduledExecutorService, созданный Executors.newSingleThreadScheduledExecutor(). Runnable, который вы передаете Исполнителю, будет читать из BlockingQueue.

Если ваши требования меняются и вам нужно что-то более сложное, вы, вероятно, захотите взглянуть на JMS / MDB или на планировщик типа Quartz.

1 голос
/ 24 марта 2011

Вы можете попробовать использовать Spring 3.x асинхронный вызов метода. Вызывающий метод будет возвращен немедленно, и фактическое выполнение происходит асинхронно

ApplicationContext:

<task:annotation-driven executor="asyncExecutor" mode="aspectj"/>
<task:executor id="asyncExecutor" pool-size="${executor.poolSize}"/>

На вашем бобе:

@Async
public void sendEmail(...) {
 // ...
}

Более подробную информацию см. В документации Spring: Выполнение и планирование задач Spring 3.x

1 голос
/ 23 марта 2011

Вы можете использовать планировщик для регулярного запуска заданий или использовать Spring-компонент для компонентов, управляемых сообщениями ( некоторая документация по JMS и Spring ), которые выполняются контейнером, который выполняет для вас опрос очереди. 1003 *

0 голосов
/ 23 марта 2011

Есть способы сделать это, самый простой (помимо простого создания неуправляемого потока) - это использовать commonj WorkManager .Конечно, вы можете пойти по простому маршруту потока, но он имеет недостатки в среде, в которой вы работаете (как описано в ссылке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...