spring - ActiveMQ messageId 无法停止复制
问题描述
我正在使用 ActiveMQ 进行消息传递,并且有一个要求,如果消息是重复的,那么它应该由 AMQ 自动处理。为此,我生成唯一的消息密钥并设置为消息处理器。以下是代码:
jmsTemplate.convertAndSend(dataQueue, event, messagePostProccessor -> {
LocalDateTime dt = LocalDateTime.now();
long ms = dt.get(ChronoField.MILLI_OF_DAY) / 1000;
String messageUniqueId = event.getResource() + event.getEntityId() + ms;
System.out.println("messageUniqueId : " + messageUniqueId);
messagePostProccessor.setJMSMessageID(messageUniqueId);
messagePostProccessor.setJMSCorrelationID(messageUniqueId);
return messagePostProccessor;
});
可以看出,代码生成唯一的 id,然后将其设置为 messagepostproccessor。
可以帮助我吗,我需要做其他配置吗?
解决方案
消费者可以接收到重复的消息主要有两个原因:生产者多次发送相同的消息,或者消费者多次收到相同的消息。
Apache ActiveMQ Artemis 包含强大的自动重复消息检测功能,可以多次过滤生产者发送的消息。
为了防止消费者多次接收相同的消息,必须实现幂等消费者,即 Apache Camel 提供了可与任何 JMS 提供者一起使用的幂等消费者组件,请参阅:http ://camel.apache.org/idempotent-consumer .html
推荐阅读
- android - 基本活动的 ViewDataBinding 类
- agda - 来自标准库“less”的内置“less”
- composer-php - 在 composer.json 中排除文件更新
- angular - 使用 Cypress 测试 Angular 时如何防止整页重新加载?
- java - 获取 Java 和 C# 之间的匹配校验和
- sql-server - 如何根据用户 SSRS 角色分配过滤 SSRS 中的数据
- python - 根据标准获取 Python Pandas 中的第一行数据框,而无需遍历整个数据框
- javascript - 如何根据选项的值设置只读选择的样式?
- google-apps-script - 无法从通用操作的回调函数返回卡片标记
- c# - 在 C# 中仅复制新的或修改的文件/目录