我想重复一个任务(调用外部API),直到满足以下任一条件。
为了重复任务,我们可以在驼峰中使用loop
。不幸的是loop
不支持条件,直到骆驼版本2.17,我有一些限制迫使我使用旧版本的骆驼。
如何使用apache camel解决上述问题?
答案 0 :(得分:1)
您可以使用direct
,例如无条件跳转goto
。这是一个例子:
from("direct:executeHttpRequest").routeId("executeHttpRequest")
.to("http4://test.com?throwExceptionOnFailure=false&httpClientConfigurerRef=#customHttpConfigurator" + ((proxySettings == null || "none".equals(proxySettings)) ? "" : "&" + proxySettings))//?httpClientConfigurerRef=#customHttpConfigurator
.log("HTTP response code: ${in.header.CamelHttpResponseCode}")
.choice()
.when(PredicateBuilder.and(header(Exchange.HTTP_RESPONSE_CODE).isNotNull(),
constant(HttpStatus.SC_OK).isEqualTo(header(Exchange.HTTP_RESPONSE_CODE))))
.log(LoggingLevel.INFO, logger, "200 is OK!")
.removeHeader(Exchange.HTTP_RESPONSE_CODE)
.removeHeader("LoopIndex")
//Something useful here
.otherwise()
.log(LoggingLevel.INFO, logger, "Repeat request, waiting ${header.DELAY} millis...")
.delay(5000)
.removeHeader(Exchange.HTTP_RESPONSE_CODE)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
int ind = (exchange.getIn().getHeader("LoopIndex") == null ? 0 : exchange.getIn().getHeader("LoopIndex", Integer.class));
ind++;
exchange.getIn().setHeader("LoopIndex", ind);
if (ind >= repeatCount) {
throw new RuntimeCamelException("Server not response without error " + repeatCount+" time ");
}
}
})
.to("direct:executeHttpRequest")
.end();
}
查看direct:executeHttpRequest
的工作。看起来有点可怕,但它确实有效。
答案 1 :(得分:0)
我会使用Camels错误处理&重新发送 - http://camel.apache.org/redeliverypolicy.html。
您可能需要自己抛出异常,具体取决于用于访问API的端点如何处理非200响应。 HTTP组件的throwExceptionOnFailure
设置(http://camel.apache.org/http.html)可能会做你想要的(尽管我怀疑它会认为任何2xx或3xx响应成功,而不是你非常严格的200只要求)