Java 在单线程上下文中使用JMS会话对象的原因

Java 在单线程上下文中使用JMS会话对象的原因,java,multithreading,concurrency,jms,Java,Multithreading,Concurrency,Jms,我是JMS的新手。因此,这可能是一个真正的noob问题的专家在这里,所以。 然而,我很难找到JMS是如何工作的一个非常重要的概念 来自(我的粗体强调) 会话对象是一个单线程上下文,用于生成和 消费信息。尽管它可能会分配提供者资源 在Java虚拟机(JVM)之外,它被认为是轻量级的 JMS对象 我认为JMS的主要优点是异步传递消息。术语“异步”自动适用于多线程并发生成和使用消息的概念。因此,我对所有重要的会话对象的单线程上下文的概念感到困惑。我在这里遗漏了什么?这与JTA是单线程的原因相同。对于如

我是JMS的新手。因此,这可能是一个真正的noob问题的专家在这里,所以。 然而,我很难找到JMS是如何工作的一个非常重要的概念

来自(我的粗体强调)

会话对象是一个单线程上下文,用于生成和 消费信息。尽管它可能会分配提供者资源 在Java虚拟机(JVM)之外,它被认为是轻量级的 JMS对象


我认为JMS的主要优点是异步传递消息。术语“异步”自动适用于多线程并发生成和使用消息的概念。因此,我对所有重要的
会话
对象的单线程上下文的概念感到困惑。我在这里遗漏了什么?

这与JTA是单线程的原因相同。对于如何/何时安排线程运行,没有任何硬性保证。此外,如果没有同步,就无法保证线程何时完成其工作。鉴于这些限制,很难在保持并行处理优势的同时创建事务性保证

例如,如果生成一个事务,然后生成一个线程,该线程在该事务上发送消息,但在主线程中任意提交该事务,那么事务管理器应该做什么(忽略
commit()
?使
send()
?失败)。如果我还有其他事务性工作(数据库提交)尚未完成,但我的消息发送线程已经完成并调用了
commit()
,该怎么办?当TransactionManager试图确定所有事务参与者的
2阶段提交
状态时,如果线程启动并开始更多工作,该怎么办

事务API都基于定义良好的工作单元。当工作单元在单个线程中运行时,这些API非常清晰。否则事情会变得复杂,Java EE规范中没有提到的实现也会涵盖这些事务。这些事务管理器允许嵌套事务和/或跨多个线程的事务。这些实现使用非常仔细设计的同步,用例有限,并且很可能最终序列化工作


对于大多数用户来说,JMS的主要好处与任何基于消息的系统类似。许多离散步骤可以提取队列中的消息,对其进行处理,并通过将结果放在另一个队列上前进到下一步。如果任何步骤成为瓶颈,您只需添加更多处理代理(MDB、Springbeans等)。每个代理在单个线程上进行处理,您可以通过创建更多代理扩展到多个核心。

会话类处理事务。因此,虽然通常只有一个
连接
,但您可以有多个线程拥有自己的会话上下文,每个线程都有各自的事务上下文。

同一消息的生产者和消费者共享同一会话,或者它们可以不同?会话限定了与代理的事务范围。您可以在同一会话中生成和使用消息。事实上,如果你想从
队列a
消费并生产到
队列B
我还有一个疑问。当你在回答中提到主线程时,你实际上指的是哪个线程?