使用消息侦听器时如何确认消息?当我尝试在消息侦听器中执行确认时,出现以下错误。
A synchronous method call is not permitted when a session is being used asynchronously: 'acknowledge'
qncylg1j1#
您所说的jms消息确认是在message.acknowledge()中吗?这个错误似乎有点奇怪。如果您不使用事务或自动确认,我认为您需要调用该方法。如果你在做异步监听,除了onmessage()方法之外,你在做什么呢?这个调用是在得到onmessage()调用的同一个线程中完成的吗?换句话说,在onmessage()或从onmessage()调用的某个方法中?如果没有,那就是违反了jms的线程规则。会话、生产者/消费者以及任何更深层的东西(比如消息)都不是线程安全的。你需要确保你没有从多个线程接触它们。如果您正在进行onmessage()调用,并且您以某种方式安排了另一个线程来执行message.acknowledge()调用,那么您应该因为线程问题而失败。如果是这样,请将调用移回运行onmessage()的同一线程。
bt1cpqcv2#
为了让后人更进一步了解第一个答案:op可能创建了一个会话,将确认模式设置为session.auto\u acknowledge,这意味着在连接上传递消息时(对于同步传递),或者在调用messagelistener#onmessage()后(对于异步传递),提供者会自动确认消息。他得到了异常,因为他对message#acknowledge()的显式调用在此模式下无效。正如buhake sindi所指出的,如果您希望手动确认消息,那么在设置将从中创建messageconsumer的会话时,必须选择session.client\u acknowledge。然后,每次调用message#acknowledge()时,当前消息以及传递到此会话/使用者的任何其他已传递但未确认的消息都将被确认回代理。
pqwbnv8z3#
根据定义,异步消息不应在协议级别得到确认。如果您想要一个确认,您必须将它构建到您的应用程序中,此时的问题是为什么不使用同步方案。
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)
t3psigkw5#
检查会话是否需要通过在会话之外使用getacknowledgemode()方法进行确认,如果需要,则只需对消息本身调用acknowledge()方法
5条答案
按热度按时间qncylg1j1#
您所说的jms消息确认是在message.acknowledge()中吗?
这个错误似乎有点奇怪。如果您不使用事务或自动确认,我认为您需要调用该方法。如果你在做异步监听,除了onmessage()方法之外,你在做什么呢?
这个调用是在得到onmessage()调用的同一个线程中完成的吗?换句话说,在onmessage()或从onmessage()调用的某个方法中?如果没有,那就是违反了jms的线程规则。会话、生产者/消费者以及任何更深层的东西(比如消息)都不是线程安全的。你需要确保你没有从多个线程接触它们。如果您正在进行onmessage()调用,并且您以某种方式安排了另一个线程来执行message.acknowledge()调用,那么您应该因为线程问题而失败。如果是这样,请将调用移回运行onmessage()的同一线程。
bt1cpqcv2#
为了让后人更进一步了解第一个答案:op可能创建了一个会话,将确认模式设置为session.auto\u acknowledge,这意味着在连接上传递消息时(对于同步传递),或者在调用messagelistener#onmessage()后(对于异步传递),提供者会自动确认消息。
他得到了异常,因为他对message#acknowledge()的显式调用在此模式下无效。正如buhake sindi所指出的,如果您希望手动确认消息,那么在设置将从中创建messageconsumer的会话时,必须选择session.client\u acknowledge。然后,每次调用message#acknowledge()时,当前消息以及传递到此会话/使用者的任何其他已传递但未确认的消息都将被确认回代理。
pqwbnv8z3#
根据定义,异步消息不应在协议级别得到确认。如果您想要一个确认,您必须将它构建到您的应用程序中,此时的问题是为什么不使用同步方案。
rpppsulh4#
这是队列会话的一个示例
只有
那我们能喝点什么吗
在这里检查消息类(http://java.sun.com/j2ee/1.4/docs/api/javax/jms/message.html)
t3psigkw5#
检查会话是否需要通过在会话之外使用getacknowledgemode()方法进行确认,如果需要,则只需对消息本身调用acknowledge()方法