Верблюд: Loop Rest Calls - PullRequest
       1

Верблюд: Loop Rest Calls

0 голосов
/ 13 февраля 2019

Я хочу использовать apache camel для вызова внешней службы REST несколько раз.После завершения всех звонков я хочу объединить результаты.Я знаю, что могу выполнить один вызов с верблюдом, как определено в верблюжий 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 верблюд для агрегации нескольких ответов службы REST : возможно, можно использовать здесь, но мне трудно обдумать, как бы я его использовал.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Возможное решение: Обязательные зависимости: 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();
    }
}
0 голосов
/ 14 февраля 2019

Вы также можете использовать компонент таймера для вызова маршрута несколько раз.Установите repeatCount на желаемое значение.Вы можете сохранить результаты в глобальном списке (с помощью Spring DI)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...