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