首页 > 解决方案 > Apache Camel - 作为 GET 请求的结果从 FTP 获取文件列表

问题描述

正如标题所示,我正在尝试从 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);

手头的问题是,使用这种方法,请求不会等待整个过程完成,它几乎会立即返回一个空响应,状态码为 200。

我尝试了多种解决方案,但它们都以两种方式中的任何一种都失败了:要么请求得到响应,即使路由尚未完成,要么路由卡在某个时刻等待飞行中的交换并等待 5 分钟超时接着说。

提前感谢您的建议和/或帮助!

注意:我正在使用 Spring Boot 应用程序 (2.0.5) 和 Apache Camel (2.22.1)。

标签: restspring-bootgetftpapache-camel

解决方案


我认为这里的问题是你的两条路线没有连接。您正在使用控制总线开始第二条路线,但它不会将值返回到第一条路线 - 正如您所指出的那样,它刚刚完成。

我认为你需要的(我没有测试过)是这样的:

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

因为这将同步使用您的 ftp 消费者,并进行后期处理并将值返回到您的休息路线。


推荐阅读