jms确认异步消息

xfyts7mz  于 2021-06-30  发布在  Java
关注(0)|答案(5)|浏览(372)

使用消息侦听器时如何确认消息?
当我尝试在消息侦听器中执行确认时,出现以下错误。

A synchronous method call is not permitted when a session is being used asynchronously: 'acknowledge'
qncylg1j

qncylg1j1#

您所说的jms消息确认是在message.acknowledge()中吗?
这个错误似乎有点奇怪。如果您不使用事务或自动确认,我认为您需要调用该方法。如果你在做异步监听,除了onmessage()方法之外,你在做什么呢?
这个调用是在得到onmessage()调用的同一个线程中完成的吗?换句话说,在onmessage()或从onmessage()调用的某个方法中?如果没有,那就是违反了jms的线程规则。会话、生产者/消费者以及任何更深层的东西(比如消息)都不是线程安全的。你需要确保你没有从多个线程接触它们。如果您正在进行onmessage()调用,并且您以某种方式安排了另一个线程来执行message.acknowledge()调用,那么您应该因为线程问题而失败。如果是这样,请将调用移回运行onmessage()的同一线程。

bt1cpqcv

bt1cpqcv2#

为了让后人更进一步了解第一个答案:op可能创建了一个会话,将确认模式设置为session.auto\u acknowledge,这意味着在连接上传递消息时(对于同步传递),或者在调用messagelistener#onmessage()后(对于异步传递),提供者会自动确认消息。
他得到了异常,因为他对message#acknowledge()的显式调用在此模式下无效。正如buhake sindi所指出的,如果您希望手动确认消息,那么在设置将从中创建messageconsumer的会话时,必须选择session.client\u acknowledge。然后,每次调用message#acknowledge()时,当前消息以及传递到此会话/使用者的任何其他已传递但未确认的消息都将被确认回代理。

pqwbnv8z

pqwbnv8z3#

根据定义,异步消息不应在协议级别得到确认。如果您想要一个确认,您必须将它构建到您的应用程序中,此时的问题是为什么不使用同步方案。

rpppsulh

rpppsulh4#

这是队列会话的一个示例

session = connection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);

只有

if (session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE) //

那我们能喝点什么吗

message.acknowledge();

在这里检查消息类(http://java.sun.com/j2ee/1.4/docs/api/javax/jms/message.html)

t3psigkw

t3psigkw5#

检查会话是否需要通过在会话之外使用getacknowledgemode()方法进行确认,如果需要,则只需对消息本身调用acknowledge()方法

相关问题