Apache ActiveMQ 5.3 - 如何配置队列以拒绝重复消息?

11
我需要队列来强制执行无重复策略。这可行吗?如果是,怎么做? (我已经谷歌了好几个小时...)
编辑:
ActiveMQSession实现有以下几行代码:
        // transform to our own message format here
            ActiveMQMessage msg = ActiveMQMessageTransformation.transformMessage(message, connection);

        // Set the message id.
        if (msg == message) {
            msg.setMessageId(new MessageId(producer.getProducerInfo().getProducerId(), sequenceNumber));
        } else {
            msg.setMessageId(new MessageId(producer.getProducerInfo().getProducerId(), sequenceNumber));
            message.setJMSMessageID(msg.getMessageId().toString());
        }

ActiveMQMessageTransformation是可插拔的(您可以进行设置),但以下if语句是相当不可争议的。

除了更改他们的代码,还有什么想法吗?

1个回答

1
ActiveMQ内置了重复消息检测 - 您如何定义重复?如果重复的消息具有相同的messageId,则应该被丢弃。

1
我想定义一个参数消息ID,用于检测重复。然而,尽管你可以使用message.setId,但它在AMQProxy中被覆盖并设置为新生成的消息ID。 - Yossale
消息ID由JMS提供程序设置 - 对于ActiveMQ,我们提供全局唯一标识符。使用JMS正确的方法是设置消息头属性。对于ActiveMQ,您可以使用生成的消息ID本身 - 因为它始终是唯一的。 - Rob Davies
我正在使用ActiveMQ 5.4.1。如果我设置自定义的JMSMessageID,它不会按预期工作。 JMSMessageId由ActiveMQ内部构建。我在https://dev59.com/m2445IYBdhLWcg3wTIfm上报告了一个示例和HornetQ示例。 - Andre Pastore
是的 - 并非所有的JMS提供者都接受用户设置JMSMessageID。在JMS规范中,提供者可以忽略它。您是否可以使用在标头上设置的明确定义的属性?这样,您的消息ID将与任何JMS提供者一起工作。 - Rob Davies
2
@Rob 但是我该如何让ActiveMQ在检测到重复时遵守头部上定义的属性呢?如果队列中已经有另一个MY_MSG_ID=123的消息,无论JMSMessageID如何,我该如何让ActiveMQ丢弃传入的消息? - Antares42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接