JMS 会话的目的是啥?

Posted

技术标签:

【中文标题】JMS 会话的目的是啥?【英文标题】:What is the purpose of a JMS session?JMS 会话的目的是什么? 【发布时间】:2011-02-10 19:18:52 【问题描述】:

JMS 会话的目的是什么?为什么仅一个连接不足以在发送方和接收方之间交换 JMS 消息?

【问题讨论】:

【参考方案1】:

See java.sun.com

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

会话有多种用途:

它是消息生产者和消费者的工厂。 它提供供应商优化的消息工厂。 它支持将跨越其生产者和消费者的工作组合成原子单元的单个事务系列。 它定义了它使用的消息和它产生的消息的顺序。 它会保留它使用的消息,直到它们被确认为止。 它序列化向其消息消费者注册的消息侦听器的执行。

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

一个典型的用途是在消息到达之前在同步 MessageConsumer 上设置一个线程块。然后线程可以使用一个或多个 Session 的 MessageProducers。

【讨论】:

线程是一个关键点。会话关闭(生产者、消费者、消息)不是线程安全的。对于这些东西,你必须要么防止并发访问,要么创建多个线程不共享。 真的吗?从 Java API 复制粘贴...docs.oracle.com/javaee/7/api/javax/jms/Session.html 在“单线程上下文”中,什么是上下文,在Spring框架、apache camel等中使用。上下文一般用于解决混淆。就像在水果或小工具的情况下想要一个苹果一样。【参考方案2】:

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

简单地说,会话本质上是线程对连接的看法,以下是 JMS 规范在访问线程和会话时必须说明的内容。

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

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

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

看看 OP 的发布日期,我想我迟到了将近十年。 :D

【讨论】:

迟到了七年多,但迟到总比没有好。 :) 什么是“会话资源”? 简单地说它的成员,例如ActiveMQSession 有很多不能同时访问的成员。

以上是关于JMS 会话的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

WCF 可靠会话的目的是啥?

已经实施 csrf 保护时使用会话 id 的目的是啥?

JMS编程模型

Mule 4 - 如何为 JMS 连接器设置会话 ID

JMS/Seam——创建会话时出现异常?

我可以在 MDB 中获取源 JMS 会话吗?