JMS消息中的故障处理

问题描述 投票:0回答:1

我有一个ActiveMQ Artemis队列,我从中读取队列并进行一些处理并将其写入数据库。队列消息非常重要,我不能丢失消息。

我的处理:

读取队列(大批量)->处理->写入数据库(事务性)

我的问题是,如果我的服务在“处理”阶段出现故障,将会发生什么。由于我已经阅读了消息(使用Spring JMS),因此我将丢失该批次(即使我使用的是client_ack-Spring在读取消息后也会进行确认)。有避免这种情况的模式吗?

我的解决方案是使用JMS事务并为批处理编写不同的主题,如下所示。

读取队列->写入某些主题->提交JMS事务->处理->写入数据库(事务性)

这是好模式吗?我可以使用什么替代方法?

jms spring-jms activemq-artemis
1个回答
0
投票

如果无法处理该消息,则发送否定确认是很好的。您可以在交易过程中发送NACK。例如,带有STOMP协议的NACK。该消息然后保留在队列中。 ActiveMQ可以配置为在收到来自消费者的NACK时进行重新交付尝试。

https://stomp.github.io/stomp-specification-1.2.html#NACK

© www.soinside.com 2019 - 2024. All rights reserved.