2014-02-13 3 views
1

У меня есть маршрут Camel, который отменяет сообщение из очереди, отправляет его компоненту для обработки, а затем возвращает сообщение обратно в другую очередь.Camel 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> 

Update: возможно, что-то вроде этого:

<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> который затем используется кэш, чтобы сохранить сообщения в Память.

Say это новый боб называется FilterBean и был метод dedupe() на ней: как я подключить его в Spring XML, и какие классы/интерфейсы делает боб нужно реализовать, чтобы называться внутри маршрута ?

+1

Вы можете использовать кэш, как Ehcache или Memcached, который поддерживает распределенную развертывание в качестве службы бэкэнда к [Фильтр сообщений] (http://camel.apache.org/message-filter.html). – Ralf

+0

Спасибо @ Ralf (+1) - см. Мое обновление. Любые идеи относительно того, какой API/интерфейс мне нужно реализовать для 'FilterBean', и как подключить его в Spring XML? Еще раз спасибо! – AdjustingForInflation

ответ

3

Я думаю, что вы ищете Idempotent Consumer, который предоставляет Camel. Существуют различные подходы в зависимости от ваших потребностей, таких как Memory, JDBC, Hazelcast ... Я не уверен, будет ли это работать для вас, поскольку вы используете 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