rollback收到了jms消息

时间:2012-05-07 07:24:37

标签: java-ee transactions jms rollback

如何在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.

2 个答案:

答案 0 :(得分:1)

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

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

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

如果您确认是基于交易,则使用

session.rollback();

其他明智的使用

session.recover();

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

除了自动确认模式消息之外,

除了您根据确认设置确认或提交会话之前,消息将保留在代理。

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

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

答案 1 :(得分:0)

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

您还可以使用clientAcknowledge消息确认模式对收到的消息进行“回写”。在此模式下,您不会对收到的消息执行message.acknowledge()