为啥选择 JMS 作为异步解决方案?为啥它比简单的实体 bean 更好?
Posted
技术标签:
【中文标题】为啥选择 JMS 作为异步解决方案?为啥它比简单的实体 bean 更好?【英文标题】:Why choosing JMS for asynchronous solution ? Why is it better than a simple entity bean?为什么选择 JMS 作为异步解决方案?为什么它比简单的实体 bean 更好? 【发布时间】:2011-01-06 23:49:11 【问题描述】:在我参与的大多数项目中,异步解决方案的选择一直是很多讨论的来源......
每次单个实体 bean 足以管理一个队列:我们只需将一条消息(票证)存储在一个表中,然后一个处理 cron 将队列解栈。这个简单的解决方案的优点是非常简单,它基于数据库的事务上下文,我们可以在执行过程中管理接收到的消息的状态。
因此我提出以下问题:
1) 我们对使用JMS 有什么兴趣? JMS 有什么好处?
2) 在哪种情况下更喜欢 JMS 而不是实体 bean?
感谢您的回复和反馈!
【问题讨论】:
因此您决定自行组合一个基于数据库的消息队列,而不是使用现有的消息传递系统。当然它会起作用,但我会问你为什么还要为实体 bean 烦恼,你没有要维护的状态,或者要对表进行更新,所以你可以直接从 servlet 进行 db 调用(如果基于 web)或无状态会话 bean。所有这些对于实际的消息传递系统来说仍然是很差的替代品。 因为有时人们不想使用 EJB 【参考方案1】:1) 我们对使用 JMS 有什么兴趣? JMS 有什么好处? 2) 在 哪种情况更喜欢 JMS 与 实体bean?
只要只有一个消费者,你的方法就很有效。否则,它将需要一个锁定方案,以便相同的消息不会被传递两次,等等。这就是 JMS 开箱即用的功能:使用 JMS 代理处理生产和消费,管理与多个消费者/生产者的所有传递问题。
JMS 的其他优势是服务质量和管理,例如重新传递尝试、死消息队列、负载管理、可扩展性、集群、监控等。
JMS 还支持发布-订阅或点对点。
这有点像比较在数据库中插入一行的 JDBC 语句与完整的 ORM。两者都可以在数据库中插入一行,但 ORM 会提供更多,而且你不会重新发明***来处理低级问题...... (类比不是那么好,但是嗯)
我建议你看看FAQ。
【讨论】:
感谢您的回复。我同意您关于必须用实体 bean 重新发明***以及必须在多线程环境中管理锁定模式的观点。好的,让我们阅读常见问题解答! 请注意,我并不是说 JMS 也不是 解决方案。使用 JMS 会使解决方案的某些方面变得复杂(例如,处理分布式事务、配置队列、管理消息传递错误等)。如果每个队列有 一个 消费者,并且 非功能性 问题不是问题,那么一个表和一个线程可能会很好地完成这项工作。我已经看到了这两种方法并且都有效。【参考方案2】:在 Java EE 中,基本上有 3 种机制来处理异步:
-
JMS
CDI 事件总线
@Asynchronous 注解的无状态会话 bean 方法
ewernli 已经很好地解释了 JMS 的优势。这是一个功能非常齐全的系统,但所有这些功能确实会花费一些开销和复杂性,例如管理所涉及的管理对象。
此外,JMS 规范近十年没有更新。它仍然非常有用,显示了 API 设计中的大量远见,但有时它会让人感觉有点神秘。必须定义诸如目的地之类的管理对象的方式,您需要获取连接、创建会话等的方式,这一切都让人感觉有点低级、陈旧和神秘。虽然使用消息驱动 bean 大大简化了接收消息,但发送却没有。
然后,由于某些遗留的奇怪原因,Web 模块被禁止监听 JMS 目的地。当然,不再有任何理由,但它在古老的 J2EE 1.3 和更高版本的规范中。兼容的应用程序服务器仍然支持此规则,但它们都提供了供应商特定的配置以允许它。然而,这会降低您的应用程序的可移植性。
过去使用 JMS 的用例的一个子集是在单个应用程序中非常简单的基于事件的编程。为此,可以说 CDI 事件总线现在更适合,因为它是一种更简单、更现代且整体更轻量级的方法。
使用 JMS 的另一个用例子集只是异步执行任何工作。为此,人们有时会制作一个 MDB,然后只需从消息中解包参数并调用一些无状态会话 bean 的方法,直接传入这些参数。在这种情况下,绝对不需要消息传递范式,而仅调用 @Asynchronous 注解的方法是一种更简单、更直接的方法。
【讨论】:
CDI 事件总线不是异步的。 @Luke 你是对的。我所说的答案是不正确的。我的意思是 CDI 事件总线是 JMS 的简单替代品,适用于那些用于事件(实际上不是异步的)的情况,@Asynchronous
适用于那些只需要一些异步行为的情况。让我们看看如何最好地更新它;)以上是关于为啥选择 JMS 作为异步解决方案?为啥它比简单的实体 bean 更好?的主要内容,如果未能解决你的问题,请参考以下文章
Interlocked 是如何工作的,为啥它比 lock 更快? [复制]