【问题标题】:Camel : Loop Rest Calls骆驼:循环休息调用
【发布时间】:2019-07-07 11:37:42
【问题描述】:

我想使用 apache camel 多次调用外部 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:可能可以在这里使用,但我很难弄清楚我将如何使用它。

【问题讨论】:

  • 创建一个剩余调用列表,将列表发送到拆分器,它将汇总响应。由于您事先知道列表中的项目数量,这应该很简单。
  • 需要多次调用同一个rest端点,还是调用不同的端点?
  • 请参阅下面我提出的解决方案。
  • @fg78nc 同一端点,多次,聚合结果。现在看看你的代码来理解它。

标签: java apache-camel


【解决方案1】:

可能的解决方案: 所需依赖项: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();
    }
}

【讨论】:

  • 只是为了确保您通过主体设置循环执行计数?即直接:开始,在这种情况下为“3”
  • 是否也可以根据之前的请求进行循环让我们说分页?
  • 是的,您可以将谓词传递给loop()
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多