我想用CAMEL实现以下类型的编排:
- 客户端向CAMEL发送HTTP POST请求
- CAMEL向外部端点(服务器)发送HTTP POST请求
- 外部服务器回复200 OK
- CAMEL向外部端点(服务器)发送HTTP GET请求
- 外部服务器答复
在步骤5之后,我想检查回复:如果回复是200 OK,并且state=INPROGRESS(该状态可以从接收的XML主体中检索),我想将HTTP GET重新传输到外部端点,直到状态与INPROGRESS。
我想使用retryWhile语句,但我不确定如何在路由中构建例程。例如,为了检查回复是否是200 OK和state=INPROGRESS,我可以很容易地引入谓词。所以重试While已经变成:
.retryWhile(Is200OK和INPROGRESS)
但是我应该把它放在路由中的哪里,以便重新传输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…)
提前感谢您的帮助。
在CAMEL Nabble上,有人回答了我的问题。结账:
http://camel.465427.n5.nabble.com/Camel-Apache-can-I-use-a-retryWhile-to-re-send-a-request-td5498382.html
通过使用循环语句,我可以重新传输HTTPGET请求,直到收到与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
我从未尝试过你想要做的事情,但似乎并不正确。在您显示的代码中,只有在抛出alwaysDo异常时才会进行重试。
您所引用的alwaysDo.class应该是您期望处理的Java Exception类的名称。看见http://camel.apache.org/exception-clause.html了解更多详细信息。
其想法应该是进行调用并检查响应内容,然后基于state属性执行CBR。再次调用GET或终止/继续路由。
您可能应该向ApacheCamel邮件列表(或通过Nabble)写一条消息。委员们正在关注此事,反应非常积极。