2016-12-09 13 views
-1

Я использую ESB и Camel для предоставления конечной точки моим мобильным приложениям. Оттуда мне нужно вызвать несколько веб-сервисов таким образом, чтобы ответ от предыдущего вызова определял, следует ли вызывать следующий вызов или нет, и необходимо передать одни и те же параметры запроса нескольким вызовам.ESB + Camel Вызов нескольких веб-сервисов на основе ответа от предыдущего вызова

Кроме того, мне нужно сохранить этот ответ в базе данных.

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

ответ

1

Есть много способов сделать это - просто подумайте, как вы хотите сделать такую ​​логику, как пример в чистой Java, затем переместите ее на Camel. От потоков действий перспективы нет никакой разницы. У вас есть условие - у вас должны быть операции IF или SWITCH.

  1. Прямой путь. После вызова предыдущей службы у вас есть ответ в теле с атрибутом, который является фактором принятия решения для следующего вызова. Таким образом, используйте структуру Camel «выбор-когда-иначе» (аналог оператора «switch» Java), а в «когда» используют любые доступные способы проверки состояния из тела (т. Е. «Простой», «xpath», «xquery» и т. Д.)

  2. Если логика для идентификации следующего вызова сложнее - создайте свой собственный процессор, который будет идентифицировать следующий вызов, задайте специальное свойство обмена, а затем перейдите к тому же блоку «выбор-когда-иначе» В этом случае в качестве примера вы можете иметь некоторую карту с < «предыдущий результат», «следующий вызов»> или сделать это так, как вам хотелось бы.

и ваш маршрут может выглядеть (я использую Spring):

<cml:to uri="previous_uri"/> 
<cml:processor ref="my_selector"/> <!-- it sets Exchange property "next_call" based on result from previous --> 
<cml:choice> 
    <cml:when> 
     <cml:simple>${exchangeProperty.next_call} =="SERVICE1"/> 
     <cml:to uri="next_service1_uri"/> 
     ... process Service1 result logic ... 
    </cml:when> 
    <cml:when> 
     <cml:simple>${exchangeProperty.next_call} =="SERVICE2"/> 
     <cml:to uri="next_service2_uri"/> 
     ... process Service2 result logic ... 
    </cml:when> 

и так далее ...