当用户注册新帐户时,我想在我的Web应用程序中实现异步电子邮件发送 . 这使得如果在发送电子邮件消息时存在问题或延迟(例如,邮件服务器关闭或者与邮件服务器的网络连接缓慢),则用户将不会等待发送完成 .
我的Web应用程序是使用Spring和Hibernate的JPA实现构建的 .
在这个Web应用程序中实现异步电子邮件处理的最佳和最可靠的方法是什么?
我正在考虑将数据库信息保存在数据库表中,然后由Quartz(http://www.opensymphony.com/quartz/)预定作业进行定期轮询更新,当它发现新的未发送电子邮件时,它会尝试发送它们 .
这是实现我想要的合理方式吗?
谢谢 .
编辑:
最响应的回应是将邮件发送作为同步调用,但是我认为异步方法可能最好的是我当前正在使用GMail作为我的出站邮件服务器(这是用于开发时的测试)和当我的应用程序尝试将电子邮件发送到邮件发送功能的调用返回时,我的响应延迟了25秒 . 你怎么看?
4 回答
我建议你不要打扰 . 大多数Unix风格的MTA在几十年前发明并完善了延迟发送,你不应该重新发明轮子 . 你会做得很差(与sendmail或postfix相比),你会错过一些东西 . 我最好的建议是使用Java Mail APIS javax.mail并让MTA处理异步部分 .
您可以使用MySQL或其他一些持久机制手动实现排队,但您也可以使用JMS进行排队 . 对于这种情况,它几乎是一个完美的匹配 .
在这种情况下,我会通过从主应用程序拆分邮件组件来诱惑,并让两者使用JMS进行通信 . 主应用程序在JMS中放置一条消息,邮件程序应用程序将订阅队列并尝试处理消息 .
通过配置,JMS可以很容易地持久化(例如MySQL) .
拆分webapp的好处是你抽象出通知机制,并且可能在将来实现例如Google Wave或IRC或其他任何内容,无需触摸您的主应用 .
其他人建议使用postfix或sendmail让他们处理排队 . 这也是一个很好的解决方案,特别是如果你将postfix或sendmail放在localhost上并让它进一步路由消息 . 尝试配置该邮件程序,以便只允许路由来自localhost的邮件,以防止创建一个打开的邮件程序:)
EDIT 阐明了对本地邮件程序守护程序使用JMS注释
这是相当合理的,这是Quartz构建的东西 .
但是,请注意,您根本不需要通过数据库进行计划(除非服务器停机是一个真正的问题) . 您可以简单地安排Quartz作业而无需数据库访问(最简单的Quartz示例将向您展示如何) .
否则,如果您确实选择了数据库访问,则可以完全从另一个应用程序发送电子邮件(如果您需要,这是一件好事) .
使用@Asynchronous注释,Java EE 6可以轻松实现这一点 .