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