Асинхронная почтовая обработка в веб-приложении Java

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

Мое веб-приложение создается с помощью Spring и реализации Hibernate JPA.

Каков был бы лучший и самый надежный способ для меня реализовать асинхронную почтовую обработку в этом веб-приложении?

Я думаю о сохранении информации об электронной почте в таблице базы данных, которая затем регулярно опрашивается Кварцем запланированное задание (http://www.opensymphony.com/quartz/) для обновлений и когда это находит новые неотправленные электронные письма, это пытается отправить их.

Действительно ли это - разумный способ реализовать то, что я хочу?

Спасибо.

Править:

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

7
задан JMM 13 April 2010 в 14:06
поделиться

3 ответа

Я бы посоветовал вам не беспокоиться. Большинство MTA в стиле Unix изобрели и усовершенствовали отложенную отправку десятилетия назад, и вам не стоит изобретать колесо. Вы сделаете это плохо (по сравнению с sendmail или postfix), и вы что-то упустите. Мой лучший совет - использовать Java Mail APIS javax.mail и позволить MTA разобраться с асинхронной частью.

4
ответ дан 7 December 2019 в 09:58
поделиться

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

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

JMS можно довольно легко сделать постоянным (например, MySQL) путем настройки.

Преимущество разделения веб-приложения заключается в том, что вы абстрагируете механизм уведомления и в будущем можете реализовать, например, Google Wave, IRC или что-то еще, не касаясь основного приложения.

Кто-то еще предложил использовать postfix или sendmail и позволить им обрабатывать очереди. Это также отличное решение, особенно если вы поместите postfix или sendmail на localhost и позволите ему маршрутизировать сообщения дальше. Попытайтесь настроить эту почтовую программу так, чтобы разрешалась маршрутизация только почты с локального хоста, чтобы предотвратить создание открытой почтовой программы :)

РЕДАКТИРОВАТЬ разъясняет использование JMS + комментарий к локальному демону почтовой программы

{{ 1}}
2
ответ дан 7 December 2019 в 09:58
поделиться

Это довольно разумно, именно для этого был создан Кварц.

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

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

0
ответ дан 7 December 2019 в 09:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: