【问题标题】:Using JMS or ThreadPool to send email messages使用 JMS 或 ThreadPool 发送电子邮件
【发布时间】:2011-01-23 03:58:20
【问题描述】:

我想知道:

我有一个场景。如果用户将产品添加到系统(我正在开发),则会有一个监听器向用户的客户端群发送通知,通知用户添加了新产品。

我读过这篇thread 并且(看到我以前从未使用过JMSThreadPool)我想知道是否应该使用JMS 或ThreadPooling。

我正在使用 Tomcat 5.5 及更高版本和 JBoss 5 及更高版本(取决于公司最后的手段)来部署我的 Web 应用程序。

如果我使用 JMS,我是使用 Apache ActiveMQ 还是 JBoss Messaging?它们都兼容在两个平台(Tomcat 和 JBoss)上运行吗?

提前致谢。

【问题讨论】:

    标签: java jms activemq threadpool jbossmq


    【解决方案1】:

    我会选择持久性 JMS(我只使用了 WLS JMS 和 Websphere MQ,因此无法比较 AQ 和 JBoss,以提供更好的交付保证为准)。另外,我会认真考虑让电子邮件引擎成为一个完全独立的应用程序,具体取决于您预计流量会增长多少。

    【讨论】:

    • 我正在编写一个名为 MessagingQueueService 的库,它允许通过 JMS 发送电子邮件。可以吗,还是我应该使用ThreadPoolExecutor
    【解决方案2】:

    我曾经有过类似的需求,我们使用了 JMS。然后主要问题是如何处理错误,因为 SMTP 确实不是事务性的:

    1. 如果有些邮件丢失了可以吗?
    2. 有些邮件发两次可以吗?

    我们决定最好发送两次消息,这或多或少是我们的设计:

    1. 我们依赖容器管理事务,如果由于某种原因无法发送电子邮件,我们决定回滚 JMS 事务;该消息稍后将由 JMS 重新传递,并且完成了发送消息的新尝试。

    2. 如果在发送电子邮件后 JMS 消息传递事务失败(例如,由于 JMS 的问题),事务将自动回滚并稍后重新传递消息。在这种情况下,电子邮件被发送了两次,因为 STMP 不是事务性的。

    3. 即使可以发送电子邮件(从代码的角度来看),SMTP 服务器稍后仍然可能出现问题。在这种情况下,JMS 已经交付和使用,因此我们无法知道哪些电子邮件已被处理以及如何手动重新发送它们。

    但我们已经在使用 JMS。考虑到主要论点是 JMS 是事务性的,但 SMTP 无论如何都不是,我不会仅仅为此而介绍 JMS。

    我会选择更轻的东西——可能使用 ThreadPool——并将状态存储在数据库中,以了解需要发送或已发送的电子邮件。如果有问题,您可以查看数据库并做出临时决定。

    【讨论】:

    • 您对使用更轻量级的 ThreadPool+数据库解决方案每天处理数千封电子邮件有何看法?你认为它会扩展吗?如果集群中有多个应用程序(以及多个线程池),并且所有应用程序都写入同一个数据库,该怎么办?
    • @talonx 每天一千封电子邮件不到每分钟一封邮件。因此,如果您说的是几千,那无论如何都应该没问题,如果您说的是千分之十,那将取决于。数据库将是一个瓶颈,但在这种情况下可能是可以接受的(我们不是在说十亿封邮件,对吧?)。我不知道 SMTP 服务器如何扩展。嗯,这很难说,所以把这个评论当作一个疯狂的猜测。
    • 大概是 15k,最大可能是 40k。 SMTP 服务器可能不会扩展太多 - 因此线程池必须进行某种速率控制。
    【解决方案3】:

    对于应用程序之间的通信,JMS 是一个非常好的解决方案,尤其是对于事件和通知。 JMS 允许使用所谓的异步消息发送和接收此类通知,其中发送者和接收者彼此不知道并且不需要同时可用。

    ActiveMQ 是一个使用非常广泛的消息代理,它为 Java、C/C++、C#、Perl、PHP、Python、Ruby 等提供客户端 API。这允许将 JMS 与用 Java 和其他语言编写的应用程序一起使用。

    我已经为各种业务情况多次实施 JMS 消息传递来处理事件和通知。在绝大多数情况下,无论使用什么消息代理,我都推荐和/或使用Spring JMS。 Spring JMS 非常易于使用、极其健壮且高度可扩展。 Spring JMS 消除了创建自己的消息生产者和消息消费者的复杂性,这可以为您节省大量时间。

    要了解使用 Spring JMS 发送消息是多么容易,请查看我最近写的一篇名为 Using the Spring JmsTemplate to Send JMS Messages 的博客文章。我还在写一篇关于使用 Spring JMS 接收消息的博客文章。

    如果您还有其他问题,请告诉我。

    布鲁斯

    【讨论】:

    • 很有趣的布鲁斯,我正在阅读你关于在 JBoss 上安装 ActiveMQ 的文章。我现在就成功安装了它(在 5 分钟或更短的时间内)。谢谢! :-)(现在,我需要刷新我的 JBoss 技能)。
    • Bruce,如何在 Tomcat 上设置 ActiveMQ?
    • 我也使用过这个确切的场景,尽管我使用 Spring Integration 来处理消息的分发和消费。
    • ActiveMQ 和 Tomcat 是两个单独的安装。与 ActiveMQ 通信的是您的应用程序,而不是 Tomcat。
    • 我知道mirror303,我想将ActiveMQ配置到Tomcat ResourcePool,因此我问这个问题。我在 JBoss 中也做过同样的事情。
    【解决方案4】:

    我知道这个回复对于这个讨论来说已经很晚了,但我希望它对于寻求集成 ActiveMQ 和 Tomcat 信息的人们仍然很有价值。

    我有很多人向我寻求帮助以解决他们在集成 ActiveMQ 和 Tomcat 时遇到的问题,所以我决定写一些关于它的文章。 ActiveMQ in Action 不仅涵盖了这个主题(参见第 8 章),而且我还发表了一系列题为 ActiveMQ and Tomcat: Perfect Partners 的文章。希望人们会发现这很有帮助。

    【讨论】:

      猜你喜欢
      • 2014-08-03
      • 1970-01-01
      • 2016-04-17
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多