Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JMS中只确认来自消费者的一条消息?_Java_Jakarta Ee_Jms - Fatal编程技术网

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()
调用恢复,我想我可以实现我想要的。