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

Apache camel Camel Apache:我可以使用retryWhile重新发送请求吗?,apache-camel,Apache Camel,我希望使用CAMEL实现以下类型的编排: 客户端向CAMEL发送HTTP POST请求 CAMEL将HTTP POST请求发送到外部端点(服务器) 外部服务器回复200 OK CAMEL将HTTP GET请求发送到外部端点(服务器) 外部服务器应答 在步骤5之后,我想检查回复:如果回复是200 OK且状态=INPROGRESS(可以从接收到的XML正文中检索此状态),我想将HTTP GET重新传输到外部端点,直到状态与INPROGRESS不同 我想使用retryWhile语句,但我不确定如何在路

我希望使用CAMEL实现以下类型的编排:

  • 客户端向CAMEL发送HTTP POST请求
  • CAMEL将HTTP POST请求发送到外部端点(服务器)
  • 外部服务器回复200 OK
  • CAMEL将HTTP GET请求发送到外部端点(服务器)
  • 外部服务器应答
  • 在步骤5之后,我想检查回复:如果回复是200 OK且状态=INPROGRESS(可以从接收到的XML正文中检索此状态),我想将HTTP GET重新传输到外部端点,直到状态与INPROGRESS不同

    我想使用retryWhile语句,但我不确定如何在路由中构建例程。 例如,为了检查回复是否是200OK和state=INPROGRESS,我可以很容易地引入一个谓词。因此retryWhile已经变得像:

    .retryWhile(is200ok和inprogress)

    但是我应该将它放在路由中的什么位置,以便重新传输HTTP GET

    例:(只考虑步骤4和5)

    我也有点困惑“alwaysDo.class”应该是什么样子?? 或我应该使用完全不同的方法来解决这个编排吗? (我只想重新传输,只要我在进程状态下获得200 OK…)


    提前感谢您的帮助。

    我从未尝试过您要做的事情,但似乎不正确。 在您显示的代码中,只有在抛出alwaysDo异常时才会发生重试

    您引用的alwaysDo.class应该是您希望处理的Java异常类的名称。有关更多详细信息,请参阅


    我们的想法应该是进行调用并检查响应内容,然后基于state属性进行CBR。再次呼叫GET或终止/继续路由。

    您可能应该向(或通过)发送消息。提交人正在观看,反应非常积极。

    在CAMEL Nabble上,有人回答了我的问题。退房:

    通过使用loop语句,我可以重新传输HTTPGET请求,直到收到与INPROGRESS不同的状态。需要使用choice语句将状态检查放在loop语句中。比如:

       .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
    

    嗨,奥利弗,已经谢谢你的回复了。使用CBR并再次调用GET的问题是,我不知道需要多久执行一次。。。我只想做这件事,直到我得到一个与进展中不同的回应。。。事实上,有一种“边做边做”的方式……几乎忘了提一下:我目前一直在做一种“dummy”alwaysDo.class,所以我总是以异常结束。。。我在这方面也可能大错特错:(…对不起,我是这里的编程新手…在我看来,这是可以使用CBR来完成的。因为它允许您根据exchange(或属性)的内容执行操作)。您可以检查state属性,如果state=INPROGRESS,则可以再次执行GET,如果state!=INPROGRESS,则可以继续路由。但是,如果服务器不可用,则可能需要其他条件退出循环,例如(避免无限循环)。我真的看不出你在alwaysDo类中放了什么,你能提供它吗?嗨,Olivier,我在寻找一种轮询机制:继续发送GET消息,只要它们以INPROGRESS状态返回……一旦返回另一个状态,我就想退出轮询。所以你想以某种方式启动路由吗(from)然后做一些事情。在完成剩余的处理之后,您需要等待给定的信号(state!=INPROGRESS)。这意味着轮询器只会在路由中的特定时刻处于活动状态。对吗?好的,发布在Camel nabble上:我猜我对OneException的使用也是完全错误的…因为我在这里并没有真正的例外…(抱歉,但我并不是真正的Java程序员:()…只是想知道在我得到INPROGRESS之外的另一个状态之前,是否没有其他方法轮询服务器…这也是我的想法。您尝试执行的是do…while循环。也许您可以使用循环模式(),该模式允许您重复操作,直到满足给定条件为止(使用非复制模式)。您可以在每次迭代中执行HTTP GET并测试状态,以确定是否需要另一次迭代。事实上,当您使用.stop()时,它将停止整个过程,这可能是不需要的。如下图像:
    from(“direct:foo”).to(“direct:boo”).process(someProcessor();
    from(“direct:boo”).loop(100).choice().when(stopRedicate()).stop().end().end().process(someOtherProcessor());
    The.stop()将导致someProcessor()和someOtherProcessor()不会被调用。这可能是不需要的。
       .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