问题标签 [jms-session]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1141 浏览

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

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

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

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

这个问题的答案还表明会话是线程绑定的: JMS 连接、会话和生产者/消费者之间的关系

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

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

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

如何在一个线程中连续读取 JMS 消息并在另一个线程中根据它们的 JMSMessageID 确认它们?

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

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

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

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

这个问题Using a JMS Session from different threads似乎暗示可以在不同线程上对会话进行同步操作,但我不确定引用了哪个版本的规范。

0 投票
1 回答
55 浏览

jms - Who manages a JMS session on the consumer side

If I have a JMS queue and I wish to put a message on the queue from a publishing client, I need to first open a session, get the queue from its jndi name and then send the message to the queue.

But on the consumer side, how come I do not manually need to open a session and receive the message. Does the container always keep one open session per MDB (considering one MDB listening on one queue)

0 投票
1 回答
1465 浏览

jms - 如何在多线程应用程序中为每个连接使用多个会话?

假设我有一个连接c和许多会话对象s1s2.. sn,每个都在不同的线程中工作t1t2...tn

现在假设一个线程t3想要向特定队列发送消息q3,然后异步收听回复。所以它执行以下操作:

c.stop()我在开始和结束时调用的原因c.start(),因为我不确定是否有任何其他线程调用start了连接(使所有会话异步 - 对吗?)并且根据文档

“如果必须在异步会话上进行同步调用,例如创建消费者或生产者,则必须调用Connection.Stop。可以通过调用Connection.Start方法来恢复会话以开始传递消息。”

因此stop,在步骤开始时调用然后start最后调用似乎是合理的,因此代码似乎是正确的(至少对我而言)。但是,当我仔细考虑时,我认为代码有问题,因为它不能确保在完成所有步骤start之前没有其他线程调用。t3

所以我的问题是:

  • 我需要使用互斥锁来确保它吗?还是 XMS 自动处理它(这意味着我的推理是错误的)?
  • 如何设计我的应用程序,这样我就不必每次都想发送消息并异步收听回复stop时调用?start
  • 根据上面引用的文本,如果连接处于异步模式,我无法createProducer()调用createConsumer()。还有哪些我不能调用的方法?该文档没有以这种方式对方法进行分类:

此外,文档没有明确说明是什么使会话异步。说:

“通过将消息侦听器分配给消费者,不会使会话异步。仅当调用 Connection.Start 方法时,会话才会变为异步。”

我在这里看到两个问题:

  • 调用c.start()使所有会话异步,而不仅仅是一个。
  • 如果我调用c.start()但没有为消费者分配任何消息侦听器,会话是否仍然是异步的?

看来我有很多问题,所以如果有人可以向我提供文档的部分或部分的链接,这些部分或部分解释了 XMS 对象的详细信息,那就太好了。

说,

“根据规范,在 Connection 上调用 stop()、close()、在 Session 上调用 setMessageListener() 等必须等到所有消息处理完成,即直到所有已输入的 onMessage() 调用退出。所以如果有人试图在 onMessage() 中执行该操作,那么设计上就会出现死锁。”

但我不确定该信息是否真实,因为我没有在 IBM 文档中找到此信息。

0 投票
1 回答
1745 浏览

java - 如何在没有 Jms 会话对象的情况下复制 javax.jms.TextMessage

我正在使用 Spring JMS @JmsListener 注解收听 MQ Q。

我需要将 Spring Message 对象转换为 New JMS TextMessage。我知道我可以放置 TextMessage 类型的方法参数而不是 Message 并且 Spring 会自动转换它,但是我得到了不可变的对象,但是我的代码要求我保留现有的标头并在某些情况下添加新的标头。基本上我正在寻找复制 JMS Message/TextMessage 对象的正确方法,这样我就可以在没有 JMS Session 对象的情况下添加自己的标题(因为我正在使用@JmsListener,我不想自己创建新会话只是为了创建新消息)。