Jms 是否存在可以删除重复消息的企业消息队列(第一个值保持不变)?

Jms 是否存在可以删除重复消息的企业消息队列(第一个值保持不变)?,jms,message-queue,messaging,duplicate-removal,Jms,Message Queue,Messaging,Duplicate Removal,我正在寻找具有这些要求的消息队列。找不到它;也许最接近的是rabbitmq lvc插件(但我需要行中的第一个值来保持领先)。 有人知道支持这些的技术吗 消息队列是FIFO 如果重复消息正在排队,则消息队列本身会拒绝或丢弃它 例如,生产者按以下顺序将这三条消息(每个消息都有一个鉴别器值)放入队列:M1(鉴别器=7654)、M2(鉴别器=2435)、M3(鉴别器=7654)。 现在我想让消息队列看到M3与M1具有相同的鉴别器值,从而丢弃/拒绝M3。消费者只收到:M1,M2 谢谢 Tom我不知道其

我正在寻找具有这些要求的消息队列。找不到它;也许最接近的是rabbitmq lvc插件(但我需要行中的第一个值来保持领先)。 有人知道支持这些的技术吗

  • 消息队列是FIFO
  • 如果重复消息正在排队,则消息队列本身会拒绝或丢弃它
例如,生产者按以下顺序将这三条消息(每个消息都有一个鉴别器值)放入队列:M1(鉴别器=7654)、M2(鉴别器=2435)、M3(鉴别器=7654)。 现在我想让消息队列看到M3与M1具有相同的鉴别器值,从而丢弃/拒绝M3。消费者只收到:M1,M2

谢谢
Tom

我不知道其他传输,但我知道WebSphere MQ不会这样做,我相信解释为什么会广泛应用于整个类别。我会非常惊讶地发现,任何消息传输实际上都提供了这一功能。以下是一些原因:

  • 异步消息应该是原子的。不同的供应商对消息亲缘关系(两条或多条消息之间的关系)有自己的适应,但通常应避免消息亲缘关系。您的用例不仅需要传输来处理消息关联,还需要在相关消息之间的不确定间隔内处理
  • 消息负载是一个blob。出于性能原因,除了压缩或代码页转换之类的事情外,WMQ不涉及消息有效负载。任何需要解析消息负载的内容都是WebSphereMessageBroker、DataPower或WebSphereESB的工作。我希望任何声称性能良好的消息传递都会面临类似的问题,因为解析有效负载会导致更长的代码路径和非线性性能下降。例外情况是消息属性,但WMQ仅将其用于选择,我希望通常情况就是这样
  • 无状态操作。作为传输,应用程序的状态可以存储在持久消息中,但传输层的状态不应取决于不同工作单元中应用程序的状态。同样,当您希望将某些应用程序状态的管理委托给消息传递层时,特别是当这种管理跨越许多工作单元时,ESB类型的产品最适合
  • 保证交货。WMQ的设计宗旨是永远不会丢失您的持久消息。如果应用程序明确设置了过期时间,则消息可能会消失,因为发件人说可以这样做。如果消息是非持久性的,它可能会消失,但只有在特殊情况下,而且,同样,因为发送者说这样做是可以的。您描述的用例可能会导致消息消失,这不是因为发送者说消息没问题,甚至是因为接收者说消息没问题,而是因为与某个不相关的第三方进行了交互,该第三方碰巧以重复值将您带到队列中。如果第一条消息有无效的头或代码页问题并被回滚怎么办?如果我作为一个攻击者,为鉴别器吐出所有可能的4位数值的垃圾消息,该怎么办

正如我所说,我不知道其他的消息产品,所以可能有一些东西满足您的要求,如果是这样,我将有兴趣阅读有关它。然而,如果没有人回复,这篇文章可能会解释其中的原因。

谢谢Rob。我明白了为什么不让消息队列检查消息体以及为什么不让它丢弃消息体是正确的方法。我可以通过使用一个外部表来解决这个问题,该表跟踪处理过程(鉴别器->上次处理的时间)。然后,无论是谁接收了队列的消息,他们都可以自行决定是该处理还是该放弃。需要为表查询增加一点开销;但也许是一个更好的模式。很高兴这是一个有用的帖子,但我有点期待其他回复,这样我就可以了解其他运输公司对这种要求做了什么。无论如何,感谢您的跟进和接受。