JMS会话的目的是什么?

Der*_*har 23 java jms

JMS会话的目的是什么?为什么单独的连接不足以在发送者和接收者之间交换JMS消息?

bob*_*mcn 9

见java.sun.com

Session对象是用于生成和使用消息的单线程上下文.虽然它可以在Java虚拟机(JVM)之外分配提供程序资源,但它被视为轻量级JMS对象.

会话有几个目的:

  • 它是消息生产者和消费者的工厂.
  • 它提供提供商优化的消息工厂.
  • 它支持一系列事务,这些事务将跨越生产者和消费者的工作结合到原子单元中.
  • 它定义了它消耗的消息的序列顺序以及它产生的消息.
  • 它会保留消息,直到它们被确认为止.
  • 它序列化了使用其消息使用者注册的消息侦听器的执行.

会话可以创建和服务多个消息生成者和消费者.

一个典型的用法是在同步MessageConsumer上有一个线程块,直到消息到达为止.然后,线程可以使用Session的MessageProducers中的一个或多个.

  • 真?从Java API复制粘贴... http://docs.oracle.com/javaee/7/api/javax/jms/Session.html (5认同)
  • 穿线是一个关键点。会话关闭(生产者、消费者、消息)不是线程安全的。对于这些东西,您必须要么防止并发访问,要么创建多个以便多个线程不共享。 (2认同)

amr*_*shu 6

我有同样的问题,这就是我在这里的原因.在这种情况下引用Doc并不是很有帮助,因为我确信OP的问题不是关于如何使用会话,或者他们做了什么,而是为什么它们确实存在,为什么不将它们的功能与Connection结合起来.恕我直言,这是一个元问题.

松散地说Sessions本质上是一个线程的连接视图,这是JMS规范在访问后者时关于线程和Session之间关系的说法.

可以使用会话或其创建的任何对象的线程数没有限制.限制是多个线程不应同时使用会话的资源.用户应确保满足此并发限制.最简单的方法是使用一个线程.在异步传送的情况下,使用一个线程在停止模式下进行设置,然后启动异步传送.在更复杂的情况下,用户必须提供显式同步.

从消息传递的角度来看,它们具有逻辑工作单元.这也是交易与Sessions结合的原因.

话虽如此,连接和会话之间通常会有1:1的映射.这就是我认为JMSContext在2.0中引入的原因.简化事情.

看看OP发布的日期,我想我差不多十年了.:d

  • 短短七年多,但迟到总比没有好.:) (2认同)