我们有一个Web应用程序可以执行各种操作,有时会根据给定的操作向用户发送电子邮件。我希望将http请求线程与实际发送电子邮件分开,以防SMTP服务器或积压存在问题。在过去,我已经使用过JMS,并没有遇到任何问题。然而,目前我们正在做的网络应用JMS只是感觉有点过度杀戮(在设置等方面)我想知道还有其他替代方案。 理想情况下,我只喜欢可以在进程中运行的东西(JVM / Tomcat),但是当卸载servlet上下文时,队列中的任何挂起项都将被交换到磁盘/数据库。我当然可以只编写一些涉及内存Q的东西,但我希望获得开源项目的好处,所以想知道那里有什么。
如果JMS真的是答案,任何人都知道某些符合我们简单要求的东西。 感谢
答案 0 :(得分:2)
我正在使用JMS来做类似的事情。我们使用JMS的原因是:
答案 1 :(得分:2)
答案 2 :(得分:2)
我认为Spring集成在这种情况下也会起作用。
答案 3 :(得分:1)
您可以使用调度程序。看看Quartz。
这个想法是你安排一份工作定期开始。所有请求都需要在某个地方保留。预定作业将读取并处理它们。您需要定义两个后续作业之间的间隔以满足您的需求。
这是推荐的做事方式。成熟的应用程序服务器为此提供了Java EE计时器,但这些服务器在Tomcat中不可用。 Quartz很好,你可以避免启动自己的线程,这会在某些情况下导致混乱(例如在应用程序更新中)。
答案 4 :(得分:1)
超越JMS,对于短消息,您还可以使用Amazon Simple Queue Service(SQS)。 虽然你可能认为这也是一种过度杀伤,但考虑到需要的维护很少,可以很好地扩展,具有超高可用性,并且不需要花费太多。 创建新队列等没有成本;或有帐户。据我所知,它纯粹基于您的操作次数(发送消息,轮询/检索)。
主要限制实际上是消息大小(还有其他因素,例如由于分布式性质而无法保证排序等);但这可能会有效。或者对于较大的消息,使用相关的AWS服务s3来存储实际的主体,并且只是通过SQS传递头文件。
答案 5 :(得分:0)
我同意JMS对此有点过分。
您可以在单独的线程中发送电子邮件(即与请求处理线程分开)。唯一需要注意的是,如果您的应用程序完全获得任何类型的流量,您可能需要使用线程池来避免资源耗尽问题。 java.util.concurrent
包对线程池有一些好处。
答案 6 :(得分:0)
由于您说应用程序“有时”会向用户发送电子邮件,因此您听起来并不像是在谈论大量邮件。一个快速而肮脏的解决方案就是Runtime.getRuntime().exec()
:
sendmail recipient@domain.com
并将消息转储到生成的Process的getOutputStream()中。之后是sendmail的问题。
图一分钟,看看你是否在服务器上有sendmail,大约十五分钟就可以把测试扔到一起,如果你没有安装,假设你发现了sendmail。再过几分钟就可以正确地构建电子邮件标题(简单 - here are some examples),然后就完成了。
希望这会有所帮助......