为什么JMS会话对象不是线程安全的?

7
为什么JMS规范设计成这样,即当从线程安全(由线程共享)的Connection对象创建Session时,Session对象不能被并发线程使用?
2个回答

7

JMS会话对象通常用于事务。我们都知道事务是线程特定的,不能跨越线程。因此,跨越线程使用事务处理的JMS会话是不可行的。我相信出于这个原因,JMS规范说会话不是线程安全的。


7

JMS 2.0规范

第25页

限制会话的并发访问有两个原因。

首先,会话是支持事务的JMS实体。实现多线程事务非常困难。

其次,会话支持异步消息消费。重要的是,JMS不要求用于异步消息消费的客户端代码能够处理多个并发消息。

此外,如果一个会话已经设置了多个异步消费者,则重要的是客户端不被强制处理这些独立消费者同时执行的情况。这些限制使得JMS更易于典型客户端使用。更复杂的客户端可以通过使用多个会话来获得所需的并发性。在经典API和特定领域的API中,这意味着使用多个会话对象。在简化API中,这意味着使用多个JMSContext对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接