Асинхронный двусторонний обмен сообщениями Apache Camel

После долгих исследований у меня до сих пор нет приемлемого решения для моих целей.

Намерение: я пытаюсь иметь несколько конечных точек/компонентов, которые генерируют обмены с проприетарным контентом. (1-й ряд 1-й столбец на картинке)

Таким образом, обмены должны быть нормализованы нормализатором/переводчиком (1-я строка 2-й столбец на картинке)

Наконец, эти нормализованные данные должны быть обработаны. (Сохранил в базе данных, сделал некоторые агрегации, вычислил некоторые результаты).

После того, как результат сгенерирован, должен быть сгенерирован совершенно новый обмен и заполнен до маршрутов, где этот процессор находится в операторе «от». (2-я строка) -> данные должны быть преобразованы в частные данные -> отправить на конечную точку

Вопросы и предварительные выводы

  • Процессор не может быть расположен непосредственно в выражении "от". Я нашел только некоторые обходные пути в виде " from (direct:somemessages)", который создается в процессоре с помощью to(direct:somemessages)

  • Процессор может быть программой как Компонент с конечной точкой. И асинхронные сообщения могут быть опубликованы с соответствующим Потребителем

Пример входящего маршрута (1-я строка)

  <route id="bar">
        <from uri="mqtt"/>
        <to uri="TranslateMQTT2MyModel"/>
        <to uri="ProcessData"/>
    </route>

Пример исходящего маршрута (мне хотелось бы) (2-я строка)

  <route id="out">
        <from uri="ProcessData"/>
        <to uri="TranslateMyModel2MQTT"/>
        <to uri="mqtt"/>
    </route>

Итак, как я могу достичь своих целей? Является ли один из двух результатов хорошим решением?

Пример схемы рабочего процесса


person ChrisSLDS    schedule 09.07.2018    source источник


Ответы (1)


Вы можете написать компонент «ProcessData», который является потребителем, но я не думаю, что вам нужно это делать.

Я думаю, вы можете использовать асинхронные возможности компонента SEDA, поэтому я думаю, что вы ищете что-то вроде:

<route id="bar">
    <from uri="mqtt"/>
    <to uri="TranslateMQTT2MyModel"/>
    <to uri="seda:processAndReply"/>
</route>

<route id="out">
    <from uri="seda:processAndReply" />
    <to uri="ProcessData"/>
    <to uri="TranslateMyModel2MQTT"/>
    <to uri="mqtt"/>
</route>

Компонент SEDA работает аналогично прямому, как вы описали, но прямой является синхронным, а SEDA - асинхронным. (Также обратите внимание на компоненты VM и Direct-VM, если вам нужно связать контексты Camel с одной и той же JVM).

person Screwtape    schedule 29.12.2018