Apache Camel:如何使用 Premove、Move 和 MoveFailed 选项从 SFTP 下载多个文件?

Apache Camel: How to download multiple files from SFTP with Premove, Move and MoveFailed options?

我有两个文件名,格式如下:

Gontagrator_1.xml
Gontagrator_2.xml

截至目前,我只选择 Gontagrater_1.xml 并将其重命名为 processing,但一旦完成就失败了。

 + "&fileName=" + sftpFileName
            + "&preMove="+sftpFileName+".$simple{date:now:yyyy-MM-dd'T'hh-mm-ss}.processing"
            + "&move="+sftpFileName+".$simple{date:now:yyyy-MM-dd'T'hh-mm-ss}"
            + "&moveFailed="+sftpFileName+".$simple{date:now:yyyy-MM-dd'T'hh-mm-ss}.failed"

现在 Gontagrator_2 出现了。建议为两者创建单独的路由。

我们可以在一个路径中同时下载并相应地重命名吗?如果是,我需要传递什么值?

Update1:​​有多个不同名称的文件,但我只需要使用以上两个文件名

更新 2:整个组件是:

    "{{m.protocol}}://{{m.hostname}}{{t.directory}}"
            + "?username={{m.username}}"
            + "&password={{m.password}}"
            + "&download=true"
            + "&useList=false"
            + "&stepwise=false"
            + "&disconnect=true"
            + "&passiveMode=true"
            + "&reconnectDelay=10000"
            + "&bridgeErrorHandler=true"
            + "&delay=30000"
            //+ "&fileName=" + sftpFileName
            + "&include="+ sftpFileName
            + "&preMove=$simple{file:onlyname}.$simple{date:now:yyyy-MM-dd'T'hh-mm-ss}.processing"
            + "&move=$simple{file:onlyname}.$simple{date:now:yyyy-MM-dd'T'hh-mm-ss}"
            + "&moveFailed=$simple{file:onlyname}.$simple{date:now:yyyy-MM-dd'T'hh-mm-ss}.failed"
            + "&readLock=idempotent-changed"
            + "&idempotentRepository=#infinispan"
            + "&readLockRemoveOnCommit=true")
        .onException(GenericFileOperationFailedException.class)
            .onWhen(exchange -> { 
                    Throwable cause = exchange.getException(GenericFileOperationFailedException.class).getCause();
                    return (cause != null && cause.toString().equalsIgnoreCase("2: No such file"));
                }).handled(true)
                .logExhausted(true)
                .logExhaustedMessageHistory(true)
                 .log("Could not find file")
                .end()
        .log("Downloading xml file")
        //.to(archiveReceivedFile(sftpFileName))       
        .split(body().tokenizeXML("ERequest", "ERequests")).streaming()
            .inOnly(E_QUEUE)

是的,您可以一次下载所有文件。

你需要

  1. 删除 fileName 选项(这样路由将选择所有文件)
  2. 使用file expression language (file:onlyname) 来引用当前由 Camel SFTP 组件处理的文件名

    + "&preMove=$simple{file:onlyname}.$simple{date:now:yyyy-MM-dd'T'hh-mm-ss}.processing"
    + "&move=$simple{file:onlyname}.$simple{date:now:yyyy-MM-dd'T'hh-mm-ss}"
    + "&moveFailed=$simple{file:onlyname}.$simple{date:now:yyyy-MM-dd'T'hh-mm-ss}.failed"
    
  3. 使用include选项控制文件被拾取(REGEX匹配文件名模式)

    + "&include=Gontagrator_(1|2)\.xml"