骆驼:循环休息电话

时间:2019-02-13 15:17:25

标签: java apache-camel

我想使用apache骆驼多次调用外部REST服务。完成所有调用后,我想汇总结果。我知道我可以像camel FAQ中定义的那样用骆驼执行一次通话,

protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            rest("/say")
                .get("/sample").to("direct:hello")
                .toD("placeIwantToCall")
        }
    };
}

但是我不知道如何多次调用它。

目标: 我需要致电此外部休息服务的次数随时间而有所不同。 (有时是1,有时是10,依此类推。但是,我将知道这个数字,因为我可以从传入的标头中读取它了)所有调用完成后,我想将所有结果汇总为一个大结果。如何在Apache Camel中做到这一点? (这个问题的解决方案:Apache camel to aggregate multiple REST service responses:可能可以在这里使用,但是我很难理解如何使用它。

2 个答案:

答案 0 :(得分:0)

您还可以使用计时器组件多次调用路由。将repeatCount设置为所需的值。您可以将结果存储在全局列表中(借助Spring DI)

答案 1 :(得分:0)

可能的解决方案: 所需依赖项:camel-core,camel-http4,camel-test,slf4j,log4j

import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.invoke.MethodHandles;

public class RestMultiAggregation extends CamelTestSupport {

    Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

    @Override
    protected RoutesBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct:start")
                        .setHeader("CamelHttpMethod", constant("GET"))
                        .loop(body())
                        .enrich("https4://cat-fact.herokuapp.com/facts/random",
                                (oldExchange, newExchange) -> {
                                    if (newExchange == null) {
                                        return oldExchange;
                                    }
                                    String prev = oldExchange.getIn().getBody(String.class);
                                    String curr = newExchange.getIn().getBody(String.class);
                                    String body = prev + "\n" + curr;
                                    oldExchange.getIn().setBody(body);
                                    return oldExchange;
                                })
                        .end()
                        .to("mock:result");
            }
        };
    }

    @Test
    public void testMultipleRestCalls() throws InterruptedException {
        MockEndpoint mock = getMockEndpoint("mock:result");
        mock.expectedMessageCount(1);
        template.sendBody("direct:start", "3");
        String aggregatedResponse = mock.getExchanges().get(0).getIn().getBody(String.class);
        log.info("Aggregated response: {}", aggregatedResponse);
        assertMockEndpointsSatisfied();
    }
}