gpt4 book ai didi

java - JMS:可以在一个线程上通过 MessageConsumer.receive() 读取,然后从另一个线程调用 Session.commit() 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 07:30:05 25 4
gpt4 key购买 nike

JMS session 规范警告,当有 MessageListener 实例注册到 session 时, session 对象/实例只能在创建它们的线程上使用。但是,它没有说明(仅)使用 MessageConsumer 对象时线程不安全,或者更准确地说,“线程绑定(bind)”。

http://docs.oracle.com/javaee/1.3/api/javax/jms/Session.html

(“线程绑定(bind)”是指该对象只能在特定线程上使用,而不仅仅是在没有同步或其他协调的情况下在多个线程上使用它是不安全的)

这个问题的答案也表明 session 是线程绑定(bind)的:Relationship between JMS connections, sessions, and producers/consumers

但是,作者可能会做出一些假设,也可能不会,而且问题更多的是关于编写消息,而不是阅读消息。

有谁知道您是否可以在一个线程上的 session 中读取消息,然后让另一个线程处理该消息并在另一个线程上对该消息(使用 session )进行提交/回滚?仅会从处理线程内针对 session 调用提交(或回滚)——不会对 Connection/Session/MessageConsumer/Message 链进行其他调用。此外,在提交/回滚发生之前, session 不会用于再次读取。

以下 S/O 问题似乎密切相关,但没有令人满意地解决我的建议:

How to continuously read JMS Messages in a thread and achnowledge them based on their JMSMessageID in another thread?

Reason for a JMS Session object to be used in a single threaded context

虽然我想在多个线程上使用 session ,但永远不会有重叠的消息请求/事务。

我试图避免进一步重构现有代码,因此我正在考虑做一些有点奇怪的事情,而不是在每个工作线程上都有一个 session 。

      • 编辑(7 月 26 日)- - -

这个问题,Using a JMS Session from different threads ,似乎表明可以在不同线程上使用 session 进行同步操作,但我不确定引用的是哪个版本的规范。

最佳答案

也许您已经在规范中找到了方法。

引用 Session 的文档http://docs.oracle.com/javaee/1.3/api/javax/jms/Session.html

A Session object is a single-threaded context for producing and consuming messages. Although it may allocate provider resources outside the Java virtual machine (JVM), it is considered a lightweight JMS object.

所以它是单线程的;创建一个并不昂贵。

而且你必须注意

The close method is the only session method that can be called while some other session method is being executed in another thread.

因此,例如,您必须确保读取提交不会重叠。

从技术角度我会重构它;代码将更容易阅读/维护。资源处理(打开/关闭)只能在一个线程(一种方法)中进行。这也将简化异常处理。

[从法律角度来看:您承认您正在做一些“奇怪”的事情 - 违反建议。我不会提供这样的软件。]

关于java - JMS:可以在一个线程上通过 MessageConsumer.receive() 读取,然后从另一个线程调用 Session.commit() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17870523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com