Apache Camel FTP在删除少于指定数量的文件时进入无限循环

stszievb  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(170)

我设置了Apache Camel Route,它从FTP服务器读取XML文件,将内容转换为Java对象,将创建的Java对象聚合到一个List中,然后将List转储到一个Direct对象中以供ConsumerTemplate读取。要处理的文件数量为10。
这是我的路线:

JAXBContext jaxbContext = JAXBContext.newInstance(new Class[]{Dokumente.class});
JaxbDataFormat jaxbDataFormat = new JaxbDataFormat();
jaxbDataFormat.setContext(jaxbContext);

from("ftp://tstusr@localhost/uploads/Replies?delete=true&password=ftpServPW&passiveMode=true&binary=true&disconnect=true")
        .unmarshal(jaxbDataFormat)
        .aggregate(AggregationStrategies.flexible(Dokumente.class).accumulateInCollection(LinkedList.class))
        .constant(true)
        .completionSize(10)
        .to("direct:files");

Route正在做它应该做的事情,除了“delete=true”部分。当我的目录中的文件少于10个时,程序进入无限循环。在我的本地FTP测试服务器(FileZilla Server)中,我可以看到它登录,更改目录,执行LIST命令,然后退出。它在无限循环中反复这样做。
我如何修复路由以阻止它这样做?我不知道目录中有多少文件。这意味着总是可以少于批处理大小。我使用的是Apache Camel 3.11.4版。

acruukt9

acruukt91#

问题在于,如果可用文件少于指定的文件数量,则路由会一直等待缺少的文件出现。
因此,如果它被告知要下载10个文件,但只有2个存在,它将等待8个丢失的文件。
我必须手动终止路由,首先给它一个ID。然后我必须设置路由选项sendEmptyMessageWhenIdle=true,并附加一个处理器,当收到空消息时,它会停止路由。由于空消息没有任何作用,我随后将其过滤掉,然后强制com。调整后的路由如下所示

from("ftp://dm@localhost/uploads/Replies?delete=true&password=ftpPass&passiveMode=true&binary=true&disconnect=true&sendEmptyMessageWhenIdle=true") 
            .routeId("ftpRoute")
            .process(new Processor() {

                @Override
                public void process(Exchange exchange) throws Exception {
                    if (exchange.getMessage().getBody() == null) {
                        exchange.getContext().getRouteController().stopRoute("ftpRoute");
                    }
                }
            })
            .filter(simple("${body} != null"))
            .unmarshal(jaxbDataFormat)
            .aggregate(AggregationStrategies.flexible(Dokumente.class).accumulateInCollection(LinkedList.class)) 
            .constant(true) 
            .completionSize(10) 
            .forceCompletionOnStop()
            .to("direct:files");

相关问题