JMS会话的目的是什么?

时间:2010-04-21 20:55:48

标签: java jms

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

2 个答案:

答案 0 :(得分:9)

See java.sun.com

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

会话有多种用途:

  • 这是一个消息制作者和消费者的工厂。
  • 它提供提供商优化的消息工厂。
  • 它支持一系列事务,这些事务将跨越生产者和消费者的工作组合成原子单元。
  • 它定义了它消耗的消息的序列顺序及其产生的消息。
  • 它会在确认之前保留消耗的消息。
  • 它序列化使用其消息使用者注册的消息侦听器的执行。

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

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

答案 1 :(得分:5)

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

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

  

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

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

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

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