如何在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.
答案 0 :(得分:1)
某些点回滚,以便其他使用此队列消息的程序可以接收消息吗?
回滚不是将消息发送回队列而其他人消耗它的好策略。如果要将消息传播给多个消费者,请使用Tpoic而不是Queue。
关于发回信息。 回滚/重新发送消息到JMS代理取决于确认模式。
如果您确认是基于交易,则使用
session.rollback();
其他明智的使用
session.recover();
它会将所有未确认的消息恢复回JMS代理。
除了自动确认模式消息之外,除了您根据确认设置确认或提交会话之前,消息将保留在代理。
因此,当您完成成功的消息处理确认它。如果msg处理有错误/异常,则回滚/恢复以发回。如果您不想再次处理失败的消息(让它成为时间约束处理/未在给定时间内处理),则只需确认消息并记录错误。在两者之间发送消息没有限制。
回滚消息可能会再次返回到同一客户端,因此除非您使用选择器,否则回滚可能不会完全有用。检查选择器,它允许您进行基于内容的路由。
答案 1 :(得分:0)
我不清楚为什么程序想要回滚。它无法处理收到的消息吗?为什么其他消费者需要相同的信息?
您还可以使用clientAcknowledge
消息确认模式对收到的消息进行“回写”。在此模式下,您不会对收到的消息执行message.acknowledge()
。