1

如何在 Transaction 中接收队列的多条消息并在某些时候回滚,以便使用该队列中消息的其他程序可以接收消息?

我试图以某种方式这样做:

ObjectMessage obj = (objectMessage) consumer.receive();

ObjectMessage obj2 = (ObjectMessage) consumer.receive(10000);
if(obj2 == null) session.rollback(); //if we haven't received thesecond message after 10     second, also the first message should be rolled back so other consumerprograms can take it.
4

2 回答 2

2

某个点回滚,以便使用此队列中消息的其他程序可以接收消息?

回滚不是将消息发送回队列并其他人使用它的好策略。如果您想将消息传播给多个消费者,请使用 Tpoic 而不是队列。

关于发回消息。向 JMS 代理回滚/重新发送消息取决于确认模式。

如果您的确认是基于事务的,则使用

session.rollback();

其他明智的使用以下

session.recover();

它会将所有未确认的消息还原回 JMS 代理。

除了 AUTO 确认模式,消息将保留在代理中,直到您根据确认设置确认或提交会话。

因此,当您完成成功的消息处理时,请确认它。如果 msg 处理有错误/异常,则回滚/恢复以发回。如果您不想再次处理失败的消息(让它成为时间限制处理/在给定时间内未处理),那么只需确认消息并记录错误。在两者之间发送消息没有限制。

回滚消息可能会再次返回到同一个客户端,因此除非您使用选择器,否则不回滚可能不会完全有用。检查选择器它允许您进行基于内容的路由。

于 2012-05-07T07:36:03.400 回答
0

我不清楚为什么程序 a 想要回滚。它不能处理收到的消息吗?为什么其他消费者需要相同的信息?

您还可以使用clientAcknowledge消息确认模式来“回写”收到的消息。在这种模式下,您不会message.acknowledge()对收到的消息执行任何操作。

于 2012-05-07T08:26:22.363 回答