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

Java 我可以在MDB中获取源JMS会话吗?,java,jakarta-ee,jms,websphere,distributed-transactions,Java,Jakarta Ee,Jms,Websphere,Distributed Transactions,这个问题主要集中在使用WebSphereMQ(WMQ)时的WebSphereApplicationServer(WAS),因为这是我最熟悉的。然而,我认为我所说的一切更普遍地适用于所有JavaEE应用服务器,因为我坚持使用Java标准接口。我更喜欢与标准相关的解释,但对于WAS/WMQ特定的答案,我仍然非常激动 JMS 1.1定义了JMS与应用服务器接口的机制。粗略的过程是在某个点创建ConnectionConsumer以监视队列或主题。当消息显示时,JMS实现从ServerSessionPoo

这个问题主要集中在使用WebSphereMQ(WMQ)时的WebSphereApplicationServer(WAS),因为这是我最熟悉的。然而,我认为我所说的一切更普遍地适用于所有JavaEE应用服务器,因为我坚持使用Java标准接口。我更喜欢与标准相关的解释,但对于WAS/WMQ特定的答案,我仍然非常激动

JMS 1.1定义了JMS与应用服务器接口的机制。粗略的过程是在某个点创建ConnectionConsumer以监视队列或主题。当消息显示时,JMS实现从ServerSessionPool获取一个ServerSession对象,将消息加载到与ServerSession关联的会话中,然后对ServerSession对象调用start()。然后,ServerSession负责调度消息,以供应用程序服务器线程上的MDB处理。MDB将消息作为其onMessage()方法的一部分获取,并可以执行任何需要的处理

这一切都很好,直到MDB决定要发送另一条消息来响应它收到的消息。为了做到这一点,MDB必须查找或注入ConnectionFactory对象,获得连接,然后是会话,然后是MessageProducer,最后发送消息。这一切似乎都很浪费。作为向MDB传递消息的一部分,已经创建了连接和会话对象。如果MDB能够以某种方式访问该会话,它就可以避免做所有这些额外的工作,并避免创建所有这些额外的连接。额外的工作是一种成本——为了只向请求消息发送回复消息,MDB必须使用两个连接和两个会话(每个会话一个用于获取消息和发送响应)。在使用全局事务时,我认为这会迫使应用程序服务器将事务作为两阶段提交事务进行处理(至少部分(如果不是全部的话),应用程序服务器可以通过将其作为一阶段提交进行处理来优化只涉及单个资源的全局事务)。将事务设置为两阶段事务显著增加了处理消息的开销,还引入了各种新的复杂性(毫无疑问,事务是最大的事务之一)

JMS 1.1规范指出:“由于许多监听器需要使用其会话的服务,监听器可能会要求将其会话作为构造函数参数传递给它”,这似乎表明MDB使用传递初始消息的会话来发送响应是完全可以接受的。但是,我不知道有什么机制可以用标准的方式从MDB检索这个会话对象。我也不知道有任何机制以非标准方式检索它。我甚至找不到任何关于这个的问题或博客帖子

所以,问题是:为什么会这样?jmsapi非常复杂,但是,我没有看到任何东西会使MDB难以使用向其提供原始消息的会话来发送响应(如果它可以访问它的话)。MDB无法使用此会话对象的原因是什么?是否有符合标准的方法来访问会话?是否存在不符合标准的方式?应用程序服务器/JMS实现是否能够智能地优化全局事务,将单个JMS队列管理器上的两个连接上的操作优化为一个阶段提交事务(我对标准的研究和理解似乎表明这是不可能的)

应用服务器/JMS实现是否能够智能地优化 涉及对单个服务器上的两个连接进行操作的全局事务 将JMS队列管理器转换为一阶段提交事务(我的研究和开发) 对标准的理解似乎表明这是不可能的)

我的理解如下:JMS是一种特殊的JCA连接器。通常,连接器内部有一个与物理连接匹配的托管连接池。托管连接一次只能涉及一个事务(但事务可以暂停和恢复,所以有点复杂)。bean获得的是连接句柄。如果一个bean从一个给定事务中获得多个连接句柄,那么这些句柄由同一个托管连接支持,这意味着它不应该涉及分布式事务

当然,这取决于连接器和应用服务器的实现。实际上,您可以通过将JMS资源配置为非XA()来尝试这一点,并查看是否可以在MDB中接收消息并向队列发送另一条消息。它可以工作,这意味着不涉及分布式事务


注意:一个常见的优化是“”,它允许分布式事务中的一个参与者通过将其用作最后一个资源而实际成为本地参与者。最后一个参与者从未意识到它属于分布式事务

哇!!!你怎么能写这么多???天哪,我听到了。我必须马上回复,但我在手机上,我需要输入很多东西。我明天会回答。