使用JMS或ThreadPool发送电子邮件

时间:2010-03-03 11:25:57

标签: java jms activemq threadpool jbossmq

我想知道:

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

我已经阅读了这个thread并且(之前我从未使用过JMSThreadPool)我想知道是否应该使用JMS或ThreadPooling。

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

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

提前致谢。

4 个答案:

答案 0 :(得分: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接收消息的博客文章。

如果您有任何其他问题,请与我们联系。

布鲁斯

答案 1 :(得分:1)

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

  1. 如果有些电子邮件丢失了可以吗?
  2. 是否可以发送两次电子邮件?
  3. 我们决定最好两次发送消息,这里或多或少是我们的设计:

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

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

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

    4. 但我们已经在使用JMS了。我不会仅仅因为主要论点是JMS是事务性的而引入JMS,但无论如何都不是SMTP。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我会选择持久的JMS(我只使用WLS JMS和Websphere MQ,因此无法比较AQ与JBoss,无论哪种提供更好的交付保证)。此外,我会认真考虑将电子邮件引擎设置为完全独立的应用程序,具体取决于您对流量增长的预期。