2010-04-12 3 views
7

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

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

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

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

Является ли это разумным способом реализации того, что я хочу?

Спасибо.

Edit:

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

ответ

4

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

+0

Проблема с этим подходом заключается в том, что я в настоящее время использую gmail как мой исходящий почтовый сервер (это для тестирования), и я испытываю задержку в 25 секунд в ответ, когда мое приложение пытается отправить электронное письмо, когда вызов функция отправки почты возвращается. Это то, что вызвало мое мнение о том, что асинхронный подход может быть лучшим. Как вы думаете? – JMM

+0

@Denise Я согласен с асинхронным битом. Вы можете запустить фоновый поток в вашем Servlet Engine, который принимает «Сообщения» JavaMail из списка или вектора и выполняет обработку. –

2

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

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

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

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

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

EDIT осветленные использование JMS + комментарий на локальный почтовой программу демона

+0

JMS не соответствует Java Mail. JMS не имеет ничего общего с электронной почтой. –

+1

@ Chris Нет, очередь может быть реализована JMS. – extraneon

+0

это могло, но я думаю, что это слишком сложно для того, что пользователь хочет делать. Конечно, возможно, и в некоторых архитектурах, возможно, предпочтительнее (например, ESB, например, соответствие HIPAA). –

0

It довольно разумно, это то, к чему строился кварц.

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

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

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