java 在接收器崩溃时将消息保留在队列中

biswetbf  于 12个月前  发布在  Java
关注(0)|答案(3)|浏览(65)

我们有一个Spring JMS消息侦听器容器用于异步接收消息。使用DefaultMessageListenerContainer并处于sessionTransacted模式。我理解处于sessionTransacted模式意味着在出现异常的情况下,消息将被放回队列。但是,我如何才能确保即使接收者(接收消息的接收者)崩溃或者只是运行它的机器断电,消息也不会从队列中删除呢?
起初我以为CLIENT_ACKNOWLEDGE确认模式应该保存我,但apparently不是这样的,Spring无论如何都会调用.acknowledge()。
所以我的问题是,我怎样才能保证交货?使用自定义MessageListenerContainer?使用transaction manager?

vuktfyat

vuktfyat1#

使用事务会话并通过调用Session类的commit()方法来指示成功的消息处理。
检查第19.4.5节。处理配置事务中的消息。(可以使用DefaultMessageListenerContainer)。根据您对消息的处理,您可能需要一个JTA事务管理器。

k0pti3hp

k0pti3hp2#

带有Client_Acknowledge模式的Spring消息侦听器将在客户端调用message.acknowledge()时确认消息。
但是,如果在成功执行消息后,消费者没有找到来自客户端的任何确认,spring将假定执行成功并确认消息。
如果在任何时间点,消费者在处理消息时遇到异常,Spring侦听器需要知道发生了某个异常,以便将消息重新传递到队列,以便另一个消费者线程将其拾取。如果你捕捉到异常,spring会假设一切都处理好了,执行也很顺利,因此会确认消息。
Spring消息监听器只允许从onMessage监听器抛出JMS异常。捕获自定义异常并从侦听器抛出JMS异常(在记录错误以供将来参考之后)将允许您重新传递消息。

wz8daaqr

wz8daaqr3#

也可以将Session. session_ACKNOWLEDGE用于非事务会话,请参见下面引用的article
当一条消息从receive()方法成功返回时,它会自动得到确认。如果接收方使用MessageMessage接口,则当消息从onMessage()方法成功返回时,消息将自动确认。如果在执行receive()方法或onMessage()方法时发生故障,则消息将自动重新传递。JMS提供者仔细地管理消息的重新传递,并保证只有一次的传递语义。

相关问题