Camel EIP для фильтрации дубликатов

У меня есть верблюжий маршрут, который выводит сообщение из очереди, отправляет его компоненту для обработки, а затем помещает сообщение обратно в другую очередь.

Я пытаюсь устранить "повторяющиеся сообщения" во 2-й очереди. Есть ли у Camel какие-либо конечные точки, процессоры, EIP и т. Д., Которые я мог бы настроить для дедупликации сообщений в пути до их отправки во 2-ю очередь?

Пример:

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

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

1 ответ

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

Вы можете найти больше информации здесь: Идемпотент Потребитель

Другие вопросы по тегам