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

时间:2013-12-13 06:59:17

标签: java jms jms2

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

2 个答案:

答案 0 :(得分:7)

JMS 2.0 Spec

第25页

  

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

     

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

     

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

     

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

答案 1 :(得分:6)

JMS Session对象通常用于Transactions。我们都知道事务是特定于线程的,不能跨越线程。因此,不能跨线程使用事务处理的JMS会话。我相信JMS规范认为会话不是线程安全的。