4

我想知道:

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

我已经阅读了这个线程JMS并且(看到我以前从未使用ThreadPool过)我想知道是否应该使用 JMS 或 ThreadPooling。

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

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

提前致谢。

4

4 回答 4

3

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

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

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

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

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

布鲁斯

于 2010-03-03T15:52:53.487 回答
1

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

  1. 如果一些电子邮件丢失了可以吗?
  2. 如果某些电子邮件被发送两次可以吗?

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

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

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

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

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

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

于 2010-03-03T12:46:56.947 回答
1

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

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

于 2010-12-16T17:10:02.803 回答
0

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

于 2010-03-03T11:50:20.287 回答