Apache Camel - получение списка файлов с FTP в результате запроса GET - PullRequest
0 голосов
/ 04 декабря 2018

Как следует из названия, я пытаюсь получить список файлов из каталога FTP для отправки в ответ на запрос GET.

У меня есть текущая реализация маршрута отдыха:

rest().get("/files")
            .produces(MediaType.APPLICATION_JSON_VALUE)
            .route()
            .routeId("restRouteId")
            .to("direct:getAllFiles");

На другой стороне прямого маршрута у меня есть следующие маршруты:

from("direct:getAllFiles")
            .routeId("filesDirectId")
            .to("controlbus:route" +
                    "?action=start" +
                    "&routeId=ftpRoute");

    from([ftpurl])
            .noAutoStartup()
            .routeId("ftpRoute")
            .aggregate(constant(true), new FileAggregationStrategy())
            .completionFromBatchConsumer()
            .process(filesProcessor)
            .to("controlbus:route" +
                    "?action=stop" +
                    "&routeId=" + BESTANDEN_ROUTE_ID);

Проблема под рукойчто с помощью этого метода запрос не ожидает завершения всего процесса, он почти мгновенно возвращает пустой ответ с StatusCode 200.

Я пробовал несколько решений, но все они терпят неудачу любым из двух способов: либозапрос получает ответ, даже если маршрут еще не завершен ИЛИ маршрут застревает в ожидании обмена информацией в полете в определенном месте и ожидает 5-минутного тайм-аута для продолжения.

Заранее спасибо за ваш совет и /или помогите!

Примечание. Я работаю в приложении Spring Boot (2.0.5) и Apache Camel (2.22.1).

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

С помощью ответа @ Screwtape мне удалось заставить его работать для моей конкретной проблемы.Потребовались некоторые корректировки, вот список того, что вам нужно:

  • Добавьте параметр «sendEmptyMessageWhenIdle = true» в URL-адрес ftp
  • В AggregationStrategy добавьте if (exchange == null)предложение
  • В предложении установите для свойства "Finished" значение true
  • Оберните pollEnrich с помощью loopDoWhile, который проверяет готовое свойство

В полном объемевыглядит примерно так:

from("direct:ftp")
            .routeId("ftpRoute")
            .loopDoWhile(!finished)
                .pollEnrich("ftpurl...&sendEmptyMessageWhenIdle=true", new FileAggregationStrategy())
                .choice()
                    .when(finished)
                        .process(filesProcessor)
                        .end()
            .end();

В AggregationStrategy метод агрегата выглядит примерно так:

@Override
public Exchange aggregate(Exchange currentExchange, Exchange newExchange) {
    if (currentExchange == null)
        return init(newExchange);
    else {
        if (newExchange == null) {
            currentExchange.setProperty("finished", true);
            return currentExchange;
        }
        return update(currentExchange, newExchange);
    }
}
0 голосов
/ 04 декабря 2018

Я думаю, что проблема в том, что ваши два маршрута не связаны.Вы используете управляющую шину для запуска второго маршрута, но он не возвращает значение обратно первому маршруту - он просто завершается, как вы заметили.

Мне кажется, что вам нужно (я не проверял это) что-то вроде:

from("direct:getAllFiles")
            .routeId("filesDirectId")
            .pollEnrich( [ftpurl], new FileAggregationStrategy() )
            .process( filesProcessor );

, поскольку это будет синхронно потреблять ваш ftp-клиент, а также выполнять постобработку и возвращать значенияк вашему маршруту отдыха.

...