忽略jms队列中的重复消息

时间:2013-05-01 20:35:59

标签: mule

我有骡子流,我使用JMS轮询每5分钟轮询一次队列并处理队列中的所有消息。只要实体有更新,我就会在队列中收到消息。每当我看到消息时,我从消息中提取唯一ID,并使用它通过Web服务调用检索更新的实体。实体可以多次更新,因此我需要捕获所有更新。例如,如果队列中有10条消息引用相同的实体更新,那么我需要忽略9条消息并且只消耗一条消息,因为所有消息都指向同一实体。我尝试使用idempotent-message-filter。但它第一次工作正常。当应用程序在5分钟(轮询频率)之后第二次从队列中读取消息并且存在同一实体的消息(更新)时,则idempotent-message-filter忽略这些消息。理想情况下,应用程序在将来也会消耗相同的消息,如果有的话,也会在不同的轮询间隔期间消息。只有在一个间隔内发现重复时,它才应忽略这些消息。但是如果在未来的时间间隔内找到它,那么它应该重复在第一个时间间隔内执行的相同处理(忽略重复并仅处理一个)。

我希望我能够解释我的问题。

任何帮助都将受到高度赞赏。

谢谢, 维杰

4 个答案:

答案 0 :(得分:4)

尝试为过滤器对象库设置entryTTL,如:

<idempotent-message-filter idExpression="#[yourExpression]">
  <in-memory-store entryTTL="300000"/>
</idempotent-message-filter>

这样,用于过滤邮件的条目在五分钟后过期

HTH

答案 1 :(得分:1)

idempotent-message-filter是您要使用的内容,但您需要使用自定义idExpression对其进行配置:

<idempotent-message-filter idExpression="#[ ... ]" />

此表达式的文档说:

  

定义从中提取ID时要使用的一个或多个表达式   消息。例如,可以组合到标题   作为提供幂等性的消息的ID:   '#[头:FOO,巴]'。或者,您可以将消息ID与a组合使用   header:'#[message:id] - #[header:foo]'。如果未设置此属性,   默认情况下将使用'#[message:id]'。

然后,我们的想法是制作一个表达式,其中一个组件对于一个轮询(可能是系统时间的模数)是相同的,对于在一次轮询中被认为相同的消息也是如此。

答案 2 :(得分:0)

感谢大卫/丹尼尔。我用它如下:

idempotent-message-filter idExpression =“用于检索实体ID的XPATH表达式”&gt;        内存商店入口TTL =“60000”/&gt;    /幂等消息-滤光器&gt;

它对我来说很好。

感谢你们帮忙解决这个问题。

维杰

答案 3 :(得分:0)

<idempotent-message-filter idExpression="#[message:payload]" doc:name="Idempotent Message" throwOnUnaccepted="true" onUnaccepted="ValidationFailFlow">
<in-memory-store name="myInMemoryObjectStore" entryTTL="120" expirationInterval="3600" maxEntries="60000" ></inmemory-store>
</idempotent-message-filter>