Java 如何确保在回滚会话中读取的JMS消息在从未读取过消息之后进行处理?

Java 如何确保在回滚会话中读取的JMS消息在从未读取过消息之后进行处理?,java,transactions,jms,priority-queue,Java,Transactions,Jms,Priority Queue,我将使用会话在JMS消息(以及任何相应的写入)成功完成后提交对它的读取 但是,如果我有一个错误,并且必须执行回滚,我希望首先处理新消息,而不是(导致???)必须回滚的错误的消息。我希望最终重新处理失败的消息,但不希望在其他尚未看到的消息在其后面暂停时一次又一次地失败,等待删除有问题的消息或修复导致其失败的环境的操作 这是自动的吗?(如果有必要,将使用Sonic MQ)。如果是这样,这个问题的其余部分就没有意义了 我是否需要或者甚至可以重置失败消息的优先级,以将其进一步推回到队列中(在其他挂起消息

我将使用会话在JMS消息(以及任何相应的写入)成功完成后提交对它的读取

但是,如果我有一个错误,并且必须执行回滚,我希望首先处理新消息,而不是(导致???)必须回滚的错误的消息。我希望最终重新处理失败的消息,但不希望在其他尚未看到的消息在其后面暂停时一次又一次地失败,等待删除有问题的消息或修复导致其失败的环境的操作

这是自动的吗?(如果有必要,将使用Sonic MQ)。如果是这样,这个问题的其余部分就没有意义了


我是否需要或者甚至可以重置失败消息的优先级,以将其进一步推回到队列中(在其他挂起消息后面,如果有的话)?如果我需要重置优先级,我如何使该“保持”不变,因为我会回滚最初读取相关消息的事务。

我不知道Sonic MQ中有什么功能支持您的开箱即用要求,但还有其他选项:

  • 对失败的消息使用第二个队列。因此,失败的消息将在另一个队列上再次发送。例如,如果第一个队列为空,则可以启动处理

  • 在同一队列上重新发送消息(优先级相同或更低)

在这两种情况下,在发送消息后,主队列上都有一个正常的
commit

相关:。引述石雅各的答覆:

JMS规范声明:“JMS不要求提供者严格实现消息的优先级排序;但是,它应该尽最大努力在正常消息之前交付快速消息。”