2014-02-13 75 views
1

我有一個駱駝路由,將隊列中的消息出隊,將它發送給bean進行處理,然後將消息排入不同的隊列。駱駝EIP篩選重複項

我想消除第二個隊列上的「重複消息」。 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> 

每拉爾夫的建議,我可以再裏面<method></method>那又用緩存來保留郵件中引用一個bean記憶。

之所以這樣說,新豆被稱爲FilterBean,它在它有一個dedupe()方法:如何聯結起來在Spring XML,一點豆需要實現從路線裏面叫什麼類/接口?

+1

你可以使用這樣的EHCache或memcached的緩存,它支持分佈式部署作爲後端服務的[郵件篩選器] (http://camel.apache.org/message-filter.html)。 – Ralf

+0

謝謝@Ralf(+1) - 請參閱我的更新。關於如何爲FilterBean實現什麼API /接口以及如何在Spring XML中進行連接的任何想法?再次感謝! – AdjustingForInflation

回答

3

我認爲你正在尋找駱駝提供的Idempotent Consumer。根據您的需要,有不同的方法,如內存,JDBC,Hazelcast ......我不確定它是否適用於您,因爲您在消費者之後使用bean但它值得一試。從駱駝網站簡單的例子如下:

<!-- 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