2

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

如果 JMS 真的是任何人都知道的可以满足我们简单要求的答案的话。谢谢

4

7 回答 7

2

我认为弹簧集成在这种情况下也可以工作。

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

于 2009-03-27T02:51:13.457 回答
2

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

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

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

于 2009-03-18T12:38:48.353 回答
1

您可以使用调度程序。看看石英

这个想法是你安排一个工作定期开始。所有请求都需要保存在某个地方。计划的作业将读取它们并处理它们。您需要定义两个后续作业之间的间隔以满足您的需要。

这是推荐的做事方式。成熟的应用程序服务器为此提供了 Java EE 计时器,但这些在 Tomcat 中不可用。Quartz 很好,您可以避免启动自己的线程,这会在某些情况下造成混乱(例如在应用程序更新中)。

于 2009-03-18T08:00:55.353 回答
1

除了 JMS,对于短消息,您还可以使用Amazon Simple Queue Service (SQS)。虽然您可能也认为这太过分了,但请考虑这样一个事实,即所需的维护最少、可扩展性好、具有超高可用性,而且成本也不高。创建新队列等无需任何费用;或有帐户。据我记得,这完全取决于您执行的操作数量(发送消息、轮询/检索)。

主要限制确实是消息大小(还有其他限制,例如由于分布式性质而不能保证排序等);但这可能会按原样工作。或者对于较大的消息,使用相关的 AWS 服务 s3 来存储实际的正文,并通过 SQS 传递标头。

于 2009-06-22T17:47:54.883 回答
0

我同意 JMS 对此太过分了。

您可以在单独的线程中发送电子邮件(即与请求处理线程分开)。唯一需要注意的是,如果您的应用程序获得任何类型的流量,您可能希望使用线程池来避免资源耗尽问题。该java.util.concurrent软件包有一些线程池的好东西。

于 2009-03-18T07:52:30.913 回答
0

既然您说该应用程序“有时”会向用户发送电子邮件,这听起来不像您在谈论大量邮件。一个快速而肮脏的解决方案是Runtime.getRuntime().exec()

sendmail recipient@domain.com

并将消息转储到生成的 Process 的 getOutputStream() 中。之后是sendmail的问题。

花一分钟时间看看服务器上是否有可用的 sendmail,如果有的话,大约十五分钟来进行测试,假设你找到了 sendmail,则无需安装任何东西。再过几分钟来正确构建电子邮件标题(很简单 -这里有一些示例),您就完成了。

希望这可以帮助...

于 2009-03-18T12:55:09.827 回答