为什么JMS规范设计成这样,即当从线程安全(由线程共享)的Connection对象创建Session时,Session对象不能被并发线程使用?
JMS会话对象通常用于事务。我们都知道事务是线程特定的,不能跨越线程。因此,跨越线程使用事务处理的JMS会话是不可行的。我相信出于这个原因,JMS规范说会话不是线程安全的。
JMS 2.0规范
第25页
限制会话的并发访问有两个原因。
首先,会话是支持事务的JMS实体。实现多线程事务非常困难。
其次,会话支持异步消息消费。重要的是,JMS不要求用于异步消息消费的客户端代码能够处理多个并发消息。
此外,如果一个会话已经设置了多个异步消费者,则重要的是客户端不被强制处理这些独立消费者同时执行的情况。这些限制使得JMS更易于典型客户端使用。更复杂的客户端可以通过使用多个会话来获得所需的并发性。在经典API和特定领域的API中,这意味着使用多个会话对象。在简化API中,这意味着使用多个JMSContext对象。