Java 如何在JMS中只确认来自消费者的一条消息?
我有一个消费者检查队列中的消息,然后尝试根据消息进行一些处理。如果出现问题,它应该将消息留在队列中,否则它应该确认接收并将其从队列中删除 阅读文档时,使用Java 如何在JMS中只确认来自消费者的一条消息?,java,jakarta-ee,jms,Java,Jakarta Ee,Jms,我有一个消费者检查队列中的消息,然后尝试根据消息进行一些处理。如果出现问题,它应该将消息留在队列中,否则它应该确认接收并将其从队列中删除 阅读文档时,使用CLIENT\u ACKNOWLEDGE并在单个消息上调用ACKNOWLEDGE将确认该会话期间收到的所有消息 静态最终int客户端_确认 在这种确认模式下,客户端通过调用消息的确认方法来确认已使用的消息。确认已使用的消息将确认会话已使用的所有消息 这意味着我需要为我正在使用的每一条消息进行单独的会话。这似乎效率很低。有没有更好的方法来处理这个
CLIENT\u ACKNOWLEDGE
并在单个消息上调用ACKNOWLEDGE
将确认该会话期间收到的所有消息
静态最终int客户端_确认
在这种确认模式下,客户端通过调用消息的确认方法来确认已使用的消息。确认已使用的消息将确认会话已使用的所有消息
这意味着我需要为我正在使用的每一条消息进行单独的会话。这似乎效率很低。有没有更好的方法来处理这个问题?(可能是将消息放回队列的一种方式)
对于那些我想“失败”并返回队列的消息,创建一个新消息“克隆”并将其放入队列是否更好
/** All of this is in a loop checking for messages in one session **/
//It's ok
if ( Handler.messageOK( pushMessage ) )
{
//Remove from queue
message.acknowledge();
}
//I know this isn't right but how put it back?
else
{
//Recover the message for retry
jmsSession.recover();
}
消费者的运行时环境是什么?你没有使用MDB?@SteveC Tomcat 8,ActiveMQ,Weld CDI。没有MDB,真遗憾。MDBs中的消息处理是事务性的。如果事务被标记为回滚(例如通过抛出RuntimeException),容器会自动重新查询消息。使用完整的JavaEE堆栈,您会发现生活会轻松得多。@SteveC我同意这一点,并试图对此进行辩论,但我还是坚持使用tomcat。顺便说一句,如果我添加
connection.start()
调用恢复,我想我可以实现我想要的。