第 12 章 重复消息检测


AMQ Broker 包括自动重复消息检测,它会过滤接收的任何重复消息,因此您不必对您自己的重复检测逻辑进行编码。

如果没有重复检测,客户端将无法决定在目标代理或连接它的连接失败时它发送的消息是否成功。例如,如果在接收和代理处理消息 代理或连接失败,则消息不会到达其地址,并且客户端不会因为失败而从代理接收响应。另一方面,如果在收到信息并处理了代理后代理或连接失败,则消息会被正确路由,但客户端仍然不会收到响应。

此外,使用事务来确定成功不适用于这些情况。如果在处理事务提交时代理或连接失败,例如,客户端仍然可以确定它是否已成功发送。

如果客户端重新发送最后一条消息以更正假定的失败,则结果可能是发送到地址的重复消息,这可能会给您的系统造成负面影响。发送重复消息可能意味着购买订单要满足两次,例如:幸运的是,{AMQ Broker} 提供自动重复的信息检测,以防止此类问题发生。

12.1. 使用 Duplicate ID Message Property

要启用重复消息检测,请为消息属性 _AMQ_DUPL_ID 提供唯一值。当代理收到信息时,它会检查 _AMQ_DUPL_ID 是否有值。如果存在,代理则会检查其内存缓存中,以查看它是否已收到了具有该值的消息。如果找到了具有相同值的消息,则忽略传入的消息。

步骤

以下示例演示了如何使用核心 JMS 客户端设置重复检测属性。请注意,为方便起见,客户端使用恒定的 org.apache.activemq.artemis.api.core.Message.HDR_DUPLICATE_DETECTION_ID 作为重复 ID 属性的名称 _AMQ_DUPL_ID

  • _AMQ_DUPL_ID 的值设置为一个唯一的 String

    Message jmsMessage = session.createMessage();
    String myUniqueID = "This is my unique id";
    message.setStringProperty(HDR_DUPLICATE_DETECTION_ID.toString(), myUniqueID);
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.