JMS会话的目的是什么?

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

见java.sun.com

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

会话有几个目的:

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

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

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

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

松散地说,Sessions本质上是一个线程对Connection的视图,这是JMS规范在访问后者时对线程和Session之间的关系所说的内容。

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

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

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

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

Oracle文档说:

会话可以指定为事务处理。 每个事务处理会话都支持一系列事务。 每个事务将一组消息发送和一组消息接收到一个primefaces工作单元中。 实际上,事务将会话的输入消息流和输出消息流组织成一系列primefaces单元。 当事务提交时,其primefaces输入单元被确认,并且其相关的输出primefaces单元被发送。 如果完成了事务回滚,则会销毁事务的已发送消息,并自动恢复会话的输入。

事务的输入和输出单元的内容只是在会话的当前事务中生成和使用的那些消息。

使用会话的commit方法或其会话的rollback方法完成事务。 会话的当前事务的完成将自动开始下一个事务。 结果是,事务处理会话始终具有完成其工作的当前事务。

Java事务服务(JTS)或一些其他事务监视器可用于将会话的事务与其他资源(数据库,其他JMS会话等)上的事务组合。 由于Java分布式事务是通过Java Transaction API(JTA)控制的,因此禁止在此上下文中使用会话的commitrollback方法。