Camel EIP过滤重复项

时间:2014-02-13 17:36:45

标签: java apache-camel esb integration-patterns

我有一个Camel路由,它将消息从队列中取出,将其发送到bean进行处理,然后将消息排入另一个队列。

我正在尝试消除第二个队列中的“重复消息”。 Camel是否有任何端点,处理器,EIP等我可以配置为在路由中重复消息,然后才能发送到第二个队列?

示例:

<route id="myRoute">
    <from uri="{{queue-1-uri}}" />
    <to uri="bean:myBean?method=process" />
    <!-- How to dedupe right here??? -->
    <to uri="{{queue-2-uri}}" />
</route>

更新:可能是这样的:

<route id="myRoute">
    <from uri="{{queue-1-uri}}" />
    <to uri="bean:myBean?method=process" />
    <filter>
        <method>what goes here???</method>
        <to uri="{{queue-2-uri}}" />
    </filter>
</route>

根据Per Ralf的建议,我可以在<method></method>中引用一个bean,然后使用缓存将消息保存在内存中。

假设这个新bean被称为FilterBean并且它上面有一个dedupe()方法:如何在Spring XML中连接它,以及bean需要哪些类/接口实现从路线内部调用?

1 个答案:

答案 0 :(得分:3)

我认为您正在寻找Camel提供的Idempotent Consumer。根据您的需求,有不同的方法,如内存,JDBCHazelcast ...我不确定它是否适合您,因为您在消费者之后使用bean但是值得一试。 Camel网站的简单示例如下:

<!-- repository for the idempotent consumer -->
<bean id="myRepo" class="org.apache.camel.processor.idempotent.MemoryIdempotentRepository"/>

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:start"/>
        <idempotentConsumer messageIdRepositoryRef="myRepo">
            <!-- use the messageId header as key for identifying duplicate messages -->
            <header>messageId</header>
            <!-- if not a duplicate send it to this mock endpoint -->
            <to uri="mock:result"/>
        </idempotentConsumer>
    </route>
</camelContext>

您可以在此处找到更多信息:Idempotent Consumer