Как я могу реализовать маршрут о многоадресной рассылке? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть сценарий ниже.

  1. Запрос веб-служб из клиентской системы. Этот запрос заключается в том, что файл будет скопирован.
  2. Получение запроса компонентом cxf в приложении.
  3. Ответ код возврата, который означает успех после получения запроса немедленно.
  4. После отправкиВ ответ приложение получит файл.

Итак, я реализовал маршрут.

<route>
    <from uri="cxf:bean:FileTransferServiceEndPoint"/>
    <multicast parellelProcessing="true">
        <toD uri="direct:bean"/>
        <toD uri="direct:fetchFile"/>
    </multicast>
</route>
<route>
    <from uri="direct:bean"/>
    <bean method="process" ref="returnMsg"/>
    <end>
</route>
<route>
    <from uri="direct:fetchFile"/>
    <pollEnrich>
        <simple>file:/test/inBox</simple>
    </pollEnrich>
    <toD uri="file:/test/outBox"/>
</route>

Я столкнулся с некоторой проблемой. Первоначально, я думаю, что ответ будет возвращен bean returnMsg. Но Ответное сообщение не отвечало до тех пор, пока файл не был полностью обработан. Я хочу, чтобы сообщение было доставлено немедленно клиенту. И в то же время я хочу, чтобы файлы обрабатывались.

Как мне реализовать маршрут для выполнения моего сценария? Пожалуйста, дайте мне знать это решение.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Рассмотрите возможность использования компонента SEDA (обратите внимание на параметр waitForTaskToComplete) или WireTap EIP (он создает «облегченную» копию сообщения, но вы можете настроить его поведение) для извлечения файла.

PS 1.: Осторожно с использованием pollEnrich без установки тайм-аута. PS 2 .: В зависимости от способа получения основного сообщения вы можете столкнуться с проблемой закрытого потока при использовании его более одного раза, как в случае многоадресной рассылки.

0 голосов
/ 31 октября 2019

Если вы хотите, чтобы ваши «прямые» маршруты выполнялись независимо друг от друга, попробуйте использовать wireTap

<route>
    <from uri="cxf:bean:FileTransferServiceEndPoint"/>
    <wireTap uri="direct:bean"/>
    <to uri="direct:fetchFile"/>
</route>

из книги «Верблюд в действии»:

Используя метод wireTap в Java DSL, вы можете отправить копию обмена во вторичный пункт назначения, не влияя на поведение остальной части маршрута

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...