【问题标题】:JMS alternative? something for decoupling sending emails from http reqsJMS 替代方案?用于将发送电子邮件与 http reqs 分离的东西
【发布时间】:2010-10-14 00:34:24
【问题描述】:

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

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

【问题讨论】:

    标签: java queue jms


    【解决方案1】:

    我将 JMS 用于类似的事情。我们使用 JMS 的原因:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

            您可以使用调度程序。看看Quartz

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

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

            【讨论】:

              【解决方案6】:

              我同意 JMS 在这方面是矫枉过正的。

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

              【讨论】:

              • 上次查看时,使用应用程序创建的线程被认为是不可移植的,因为不同的 servlet 容器可能会限制线程实例的创建。
              • 我相信线程创建是通过 SecurityManager 发生的,管理员可以根据需要进行配置。
              【解决方案7】:

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

              sendmail recipient@domain.com

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

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

              希望这会有所帮助...

              【讨论】:

                猜你喜欢
                • 2018-02-05
                • 1970-01-01
                • 2015-01-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-01-23
                • 1970-01-01
                • 2012-08-09
                相关资源
                最近更新 更多