【问题标题】:ActiveMQ messageId not working to stop duplicationActiveMQ messageId 无法停止复制
【发布时间】: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


【解决方案1】:

消费者收到重复消息主要有两个原因:生产者多次发送同一条消息,或者消费者多次收到同一条消息。

Apache ActiveMQ Artemis 包含强大的自动duplicate message detection,可以过滤生产者多次发送的消息。

为了防止消费者多次收到相同的消息,必须实现幂等消费者,即 Apache Camel 提供了可与任何 JMS 提供者一起使用的幂等消费者组件,请参阅:http://camel.apache.org/idempotent-consumer.html

【讨论】:

    猜你喜欢
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2012-06-16
    • 1970-01-01
    • 2016-10-11
    相关资源
    最近更新 更多