Верблюжий маршрут с независимым читателем очереди сообщений

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

Моя идея состоит в том, чтобы добавить полученное сообщение в MessageQueue, а затем отправить ответ на вызов веб-службы. Затем выполнить трудоемкий процесс, прочитав очередь сообщений. Но моя проблема в том, возможно ли использовать фоновый маршрут на верблюде для такой реализации.

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

На диаграмме ниже показано, что я пытаюсь архивировать.

Моя проблема в том, можно ли отправить ответ с маршрута 1 до завершения маршрута два? Если это возможно, как я могу заархивировать его с помощью верблюда?

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

2 ответа

Решение

Это можно сделать с помощью Wire-Tap. Как показано ниже

    <route id="initialRequest">
        <from uri="bean:webService" />
        <to uri="database:saveData" />
        <wireTap uri="activemq:queue:queueName" />    
        ...continue your respond send process
    </route>

    <route id="BackgroundLongProcess">
        <from uri="activemq:queue:queueName" />
        ... Do the required time consuming process 
    </route>

Затем будет выполнен BackgroundLongProcess, но маршрут initialRequest не будет ожидать завершения процесса BackgroundLongProcess. Вы можете обратиться к документации Camelone для более подробной информации.

Это абсолютно возможно. Это пример:

<route id="HandleRequest">
    <from uri="http:incomingWebRequest" />
    <to uri="database:saveData" />
    <to uri="activemq:queue:queueName" />
    <to uri="bean:processWebRequest" />
    <to uri="http:sendResponse" />
</route>

<route id="BackgroundLongProcess">
    <from uri="activemq:queue:queueName" />
    <to uri="bean:timeConsumingProcess" />
    <to uri="database:updateProcessedData" />
</route>

В маршруте HandleRequest тело будет отправлено в очередь ActiveMQ. Это вообще быстрая операция.
МаршрутBackgroundLongProcess будет запускаться асинхронно по очереди ActiveMQ, и ваша обработка может занять больше времени.

В моем примере я отправил тело в ActiveMQ и непосредственно обработал его, вы можете отправить первичный ключ базы данных и перезагрузить данные из БД перед их обработкой.

Затем вы можете разработать свое приложение в двух разных пакетах: один, который обрабатывает часть HTTP, и другой, который выполняет фоновую обработку. Это улучшит модульность, и вы сможете обновлять / запускать / останавливать каждую службу независимо. Сообщения, хранящиеся в очереди, будут сохранены и обработаны при повторном запуске пакета обработки.

http://camel.apache.org/activemq.html

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