如何使用apache camel重复任务最多五次

时间:2016-11-08 06:52:56

标签: loops apache-camel

我想重复一个任务(调用外部API),直到满足以下任一条件。

  • 响应代码成功(200)
  • 尝试了5次。

为了重复任务,我们可以在驼峰中使用loop。不幸的是loop不支持条件,直到骆驼版本2.17,我有一些限制迫使我使用旧版本的骆驼。

如何使用apache camel解决上述问题?

2 个答案:

答案 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只要求)