【问题标题】:How to prevent duplicate delivery in HornetQ如何防止 HornetQ 中的重复交付
【发布时间】:2012-04-05 22:28:40
【问题描述】:

我们已经研究 HornetQ 几个星期了。

在我们的业务中,我们有许多“delta”消息,并且(不幸的是......)它们没有版本化(由于这是一个国际标准,它们不会被版本化)。这意味着两次发出相同的消息显然是不受欢迎的。尽管如此,该标准承认它确实无法避免,并指示发件人在这种情况下将消息标记为可能重复

我翻阅了 HornetQ 的文档,其中谈到了很多关于避免服务器复制 received 的内容,但我找不到任何关于避免 生成 重复的内容。

为了更清楚,假设以下情况:

  • 1 个总部服务器
  • 1 名消费者

在名义场景中,消费者在队列中获取一条消息,将其发送给第 3 方,并在收到确认后,向服务器确认消息,以便将其从队列中删除。

现在,这里的弱点是 ack 部分。第 3 方可能收到并处理了消息,但(出于某种原因)ack 失败并且消息没有出列。

我意识到总部不可能知道消息已完全传递,但我希望它知道传递已已尝试并且消息很可能就第 3 方而言,将是重复的

有没有办法让消费者知道这个可能已经发送状态,以便它可以适当地标记消息?

【问题讨论】:

    标签: duplicates hornetq


    【解决方案1】:

    执行此操作的一种方法是发送 NAC(如果在指定时间段内第三方未确认消息,则将错误返回给 HornetQ)。如果 HornetQ 中的队列已经配置了 max-delivery-attempts > 0,那么这将导致消息被重新传递。

    此时,HornetQ 客户端可以为参数“JMSXDeliveryCount”自省消息的标头 - 这将指示消息是第一次发送还是正在重新发送。

    这里指出的方法假设 HornetQ 客户端使用 JMS API 来消费消息。我相信核心 API 中也会有类似的东西。

    【讨论】:

    • JMSXDeliveryCount 太好了!我在ClientMessage API 中找到了等价物:getDeliveryCount
    猜你喜欢
    • 2012-07-30
    • 2022-07-12
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多