Camel Apache:我可以使用retryWhile重新发送请求吗?

时间:2012-02-17 13:20:35

标签: apache-camel

我想用CAMEL实现以下类型的编排:

  1. 客户端向CAMEL发送HTTP POST请求
  2. CAMEL将HTTP POST请求发送到外部端点(服务器)
  3. 外部服务器回复200 OK
  4. CAMEL将HTTP GET请求发送到外部端点(服务器)
  5. 外部服务器回复
  6. 在第5步之后,我想查看回复:如果回复是200 OK并且state = INPROGRESS(可以从收到的XML正文中检索此状态),我想将HTTP GET重新发送到外部终点直到状态与INPROGRESS不同。

    我正在考虑使用retryWhile语句,但我不确定如何在路由中构建例程。 例如,为了检查回复是否为200 OK和state = 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”应该是什么样子? 或者......我应该使用完全不同的东西来解决这个编排吗? (只要我在INPROGRESS状态下获得200 OK,我只想重新传输......)

    提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

在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不同的状态。需要使用choice语句将对状态的检查放在循环语句中。如下所示:

   .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

答案 1 :(得分:0)

我从未尝试过你想要做的事,但似乎似乎并不正确。 在您显示的代码中,重试仅在抛出alwaysDo异常时发生。

您要引用的alwaysDo.class应该是您希望处理的Java Exception类的名称。有关详细信息,请参阅http://camel.apache.org/exception-clause.html

想法应该是进行调用并检查响应内容,然后根据状态属性执行CBR。再次呼叫GET或终止/继续路线。

答案 2 :(得分:0)

您可能应该向the Apache Camel mailing list(或通过Nabble)发送消息。 Commiters正在观看它并且非常反应。