Асинхронно обрабатывать запрос сервлета для быстрого ответа клиенту и обработки громоздких задач в фоновом режиме на tomcat. - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть сервлет, который отправляет несколько писем на разные адреса, когда клиент запрашивает его.

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

Также отправка писем может быть отложена до нескольких минут и не должна быть в реальном времени. Я не хочу сохранять какую-либо информацию в БД и хочу обрабатывать ее только внутри приложения. Решение, которое приходит мне в голову, выглядит следующим образом:

Когда клиент запрашивает этот сервлет, сервлет добавит список рассылки и содержимое в качестве атрибута в ServletContext и отправит ответ обратно клиенту. Иметь вспомогательный сервлет, который загружается при запуске, и создавать поток таймерной задачи, который выполняется через каждые (скажем) 10 минут, читать атрибуты servletcontext, отправлять письма и удалять атрибут.

Пожалуйста, предложите, если это хорошее решение. Также предложите лучший вариант, если он есть.

1 Ответ

0 голосов
/ 29 декабря 2011

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

Или даже лучше, иметь пул потоков и отправлять Callable для каждого запроса.

Просто будьте особенно внимательны с опциями потоков / пулов потоков: убедитесь, что они заканчивают отправку всех электронных писем при (изящном) отключении Tomcat.Завершение работы Tomcat должно завершиться только после отправки всех писем.

...