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

Ani*_*kur 7 java jms jms2

为什么JMS规范的设计方式使得当创建Sessions的Connection对象是线程安全的(由线程共享)时,并发线程不能使用Session对象?

Ami*_*t G 7

JMS 2.0规范

第25页

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

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

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

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


Sha*_*shi 6

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