我想使用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:可能可以在这里使用,但是我很难理解如何使用它。
答案 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();
}
}