【发布时间】:2020-04-08 18:23:37
【问题描述】:
我正在使用 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。
可以帮我解决这个问题吗,我需要做其他配置吗?
【问题讨论】:
-
您对
setJMSMessageID的调用最终不会产生任何影响,因为 JMS 提供者(即您正在使用的代理和客户端实现)在发送消息时将 ID 分配给消息。请注意,JavaDoc 说:“此方法仅供 JMS 提供者在发送消息时设置此字段。客户端不能使用此消息来配置消息 ID。” -
另外,调用
setJMSCorrelationID不会对重复检测产生任何影响,因为这不是相关 ID 的用途。请注意,JavaDoc 说:“客户端可以使用 JMSCorrelationID 标头字段将一条消息与另一条消息联系起来。典型的用途是将响应消息与其请求消息联系起来。” -
JMS 规范没有定义重复检测,因此您必须使用 Domenico 的回答中概述的特定于提供程序的机制。
标签: spring activemq activemq-artemis