JMS替代?用于解耦从http reqs发送电子邮件的东西

时间:2009-03-18 07:40:26

标签: java queue jms

我们有一个Web应用程序可以执行各种操作,有时会根据给定的操作向用户发送电子邮件。我希望将http请求线程与实际发送电子邮件分开,以防SMTP服务器或积压存在问题。在过去,我已经使用过JMS,并没有遇到任何问题。然而,目前我们正在做的网络应用JMS只是感觉有点过度杀戮(在设置等方面)我想知道还有其他替代方案。 理想情况下,我只喜欢可以在进程中运行的东西(JVM / Tomcat),但是当卸载servlet上下文时,队列中的任何挂起项都将被交换到磁盘/数据库。我当然可以只编写一些涉及内存Q的东西,但我希望获得开源项目的好处,所以想知道那里有什么。

如果JMS真的是答案,任何人都知道某些符合我们简单要求的东西。 感谢

7 个答案:

答案 0 :(得分:2)

我正在使用JMS来做类似的事情。我们使用JMS的原因是:

  • 我们已经有了其他东西的JMS服务器(所以它只是添加了一个新队列)
  • 我们希望我们的应用程序与处理过程分离,因此任何一方的错误都会留在他们身边
  • 应用程序可以将消息放入队列,提交,然后继续。无需担心如何保留消息,如何在崩溃后重新开始等等.JMS会为您完成所有这些。

答案 1 :(得分:2)

哇,这个问题出现了很多。 CommonJ WorkManagager是您正在寻找的。可以找到Tomcat实现here。它允许您在Java EE环境中安全地创建线程,但重量轻于使用JMS(显然也可以使用JMS)。

答案 2 :(得分:2)

我认为Spring集成在这种情况下也会起作用。

http://www.springsource.org/spring-integration

答案 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),然后就完成了。

希望这会有所帮助......