2012-02-17 127 views
1

我想实现以下种类配器与CAMEL:骆驼Apache:我可以使用retryWhile重新发送请求吗?

  1. 客户端发送一个HTTP POST请求骆驼
  2. CAMEL发送HTTP POST请求外部端点(服务器)
  3. 外部服务器回复一个200 OK
  4. CAMEL发送HTTP GET请求到外部端点(服务器)
  5. 外部服务器回复

在步骤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”应该怎么样子? 或...我应该使用完全不同的东西来解决这种编排问题吗? (我只是想重新发送,只要我得到一个200 OK与INPROGRESS状态...)

在此先感谢您的帮助。

回答

2

关于CAMEL Nabble,有人回答我的问题。退房:

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

通过使用循环语句,我直到我收到了来自不同INPROGRESS的状态重新发送HTTP GET请求。状态检查需要使用选择语句放入循环语句中。所以像这样的事:

.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

实际上,当你使用.stop()时,它会停止wh ole路线,这可能是不希望的。成像是这样的: '从( “直接:富”)。为了 ( “直接:嘘”) .process(someProcessor());' '从( “直接:嘘”) .loop( 100) .choice() 。当(stopPredicate())停止() .END() .END() .process(someOtherProcessor());' 的.stop()将导致,即someProcessor()和someOtherProcessor()将不会被调用。这可能是不可取的。 – Slimer 2014-11-12 14:26:48

0

我从来没有尝试过你在做什么,但似乎看起来不正确。 在您显示的代码中,只有在引发alwaysDo异常时才会发生重试。

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

这个想法应该是打电话并检查响应内容,然后根据状态属性进行CBR。重新调用GET或终止/继续路由。

+0

嗨奥利弗,已经感谢您的答复。使用CBR和再次调用GET的问题是,我不知道我需要多少次这样做......我只是想要这样做,直到我得到与INPROGRESS不同的响应...一种“do而“其实... – opstalj 2012-02-17 15:29:41

+0

几乎忘了提及:我目前做了一种'dummy'alwaysDo.class,这样我总是会得到例外......我可能在那里也是错误的。对不起,我在这里编程的时候是一个新手... – opstalj 2012-02-17 15:33:20

+0

在我看来,这就是你可以用CBR()做的事情,因为它允许你根据你的交换内容(或属性)执行一个动作,你可以检查state属性,如果state = INPROGRESS,则再次执行GET;如果状态为!= INPROGRESS,则继续执行。如果服务器不可用(例如避免无限循环),则希望有其他条件退出循环真的看到你在alwaysDo课堂上放了什么,你能提供吗? – 2012-02-17 15:37:46

0

您可能应该写信给the Apache Camel mailing list(或通过Nabble)。委员们正在观察它,并且非常反应。

+0

好的,发布在Camel nabble上:http://camel.465427.n5.nabble.com/Camel-Apache-can-I-use -a-retryWhile-to-re-send-a-request-td5498382.html – opstalj 2012-02-20 07:31:49

+0

我想我对OnException的使用也完全错了......因为我在这里没有真正的例外......(对不起,但我不是一个真正的Java程序员:()...只是想知道是否没有其他方式来轮询服务器,直到我得到另一个国家比INPROGRESS ... – opstalj 2012-02-20 13:58:01

+0

这也是我的想法。 do是一个do ... while循环,也许你可以使用循环模式(http://camel.apache.org/loop.html),它允许你重复一个动作直到满足给定条件(使用非复制模式)。你可以在每次迭代时执行HTTP GET并测试状态以决定是否需要再次迭代。 – 2012-02-20 21:59:18