Camel Apache: можно ли использовать retryWhile для повторной отправки запроса? - PullRequest
1 голос
/ 17 февраля 2012

Я хотел бы добиться следующего типа оркестровки с CAMEL:

  1. Клиент отправляет запрос HTTP POST на CAMEL
  2. CAMEL отправляет запрос HTTP POST на внешнюю конечную точку (сервер)
  3. Внешний сервер отвечает 200 OK
  4. CAMEL отправляет HTTP-запрос GET на внешнюю конечную точку (сервер)
  5. Внешний сервер отвечает

После шага5, я хочу проверить ответ: если ответ 200 OK и состояние = INPROGRESS (это состояние может быть получено из полученного тела XML), я хочу повторно передать HTTP GET на внешнюю конечную точку, пока состояние не будетотличается от INPROGRESS.

Я думал использовать оператор retryWhile, но я не уверен, как построить подпрограмму в маршруте.Например, для проверки, является ли ответ 200 OK и состояние = INPROGRESS, я могу легко представить Предикат.Таким образом, значение retryWhile уже выглядит следующим образом:

.retryWhile (Is200OKandINPROGRESS)

, но где я должен разместить его в маршруте, чтобы HTTP-GET был повторно передан?Например: (только принимая во внимание шаги 4 и 5)

from("...")
  // here format the message to be sent out
  .to("external_server")
      // what code should I write here ??
      // something like: 
      //     .onException(alwaysDo.class)
      //         .retryWhile(Is200OKandINPROGRESS)
      //         .delay(2000)
      //     .end ()
      // or maybe it should not be here ??

Я также немного запутался, как должен выглядеть «alwaysDo.class» ??Или ... я должен использовать что-то совершенно другое, чтобы решить эту оркестровку?(Я просто хочу повторно передать, пока получаю 200 OK с состоянием INPROGRESS ...)

Заранее благодарен за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

На CAMEL Nabble кто-то ответил на мой вопрос. Проверить:

http://camel.465427.n5.nabble.com/Camel-Apache-can-I-use-a-retryWhile-to-re-send-a-request-td5498382.html

Используя оператор цикла, я мог повторно передавать HTTP-запрос GET, пока не получил состояние, отличное от INPROGRESS. Проверка состояния должна быть помещена в оператор цикла с помощью оператора выбора. Так что-то вроде:

   .loop(60)
       .choice()
       .when(not(Is200OKandINPROGRESS)).stop()  // if state is not INPROGRESS, then stop the loop
   .end() // choice
       .log("Received an INPROGRESS reply on QueryTransaction ... retrying in 5 seconds")
       .delay(5000)
       .to(httpendpoint")   
    .end() //loop
0 голосов
/ 17 февраля 2012

Вам, вероятно, следует написать сообщение в список рассылки Apache Camel (или через Nabble ). Комиссары наблюдают за этим и очень реактивны.

0 голосов
/ 17 февраля 2012

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

Класс AlwaysDo.class, на который вы ссылаетесь, должен быть именем класса исключения Java, с которым вы собираетесь работать.См. http://camel.apache.org/exception-clause.html для получения более подробной информации.

Идея должна состоять в том, чтобы сделать вызов и проверить содержимое ответа, а затем выполнить CBR на основе атрибута state .Либо снова позвоните в GET, либо завершите / продолжите маршрут.

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