当前位置: 首页 > 面试题库 >

使用Java DSL成功进行ftp传输后移动文件

孟晨朗
2023-03-14
问题内容

我已经使用spring-integration java
dsl定义了一个流,以ftp传输文件,进行处理,然后将其传输回“存档”目录,最后将其移动到本地存档目录中。这是“相当容易”的:

@Bean
public IntegrationFlow ftpInboundFlow() {
    if (ftpProperties.getEnabled() == false) {
        return null;
    }
    logger.trace("Starting ftp flow");
    return IntegrationFlows
            .from(source -> source.ftp(ftpSessionFactory()).deleteRemoteFiles(true).preserveTimestamp(true)
                    .filter(compositeWithAcceptOnceFilter())                        .remoteDirectory(ftpProperties.getRemoteDirectory())
                    .localDirectory(new File(ftpProperties.getLocalDirectory())).autoCreateLocalDirectory(true),
            consumer -> consumer.id("ftpInboundAdapter")) /* Fine from() */
            .handle(new GenericHandler<File>() {

                @Override
                @Transactional
                public Object handle(File payload, Map<String, Object> headers) {
                    logger.debug("Data arrived {} {}", payload, payload.getClass().getName());
                    return payload;
                }

            }) /* Fine GenericHandler */
            .handleWithAdapter(a -> a.ftp(ftpSessionFactory())
                    .remoteDirectory(ftpProperties.getRemoteArchiveDirectory()).autoCreateDirectory(true))              
            .get();
}

如果我追加

.handleWithAdapter(a -> a.file("'" + ftpProperties.getLocalArchiveDirectory() + "'")
.autoCreateDirectory(true).deleteSourceFiles(true))

在ftp适配器配置后,bean初始化程序将回复以下错误消息:

Caused by: org.springframework.beans.factory.BeanCreationException: The 'currentComponent' (org.springframework.integration.file.remote.handler.FileTransferringMessageHandler@80bfa9d) is a one-way 'MessageHandler' and it isn't appropriate to configure 'outputChannel'. This is the end of the integration flow.

我该如何解决?


问题答案:

作为解决方法,我重构了代码,放弃了文件适配器:

@Bean
public IntegrationFlow ftpInboundFlow() {
    return IntegrationFlows
        .from(source -> source.ftp(ftpSessionFactory()).deleteRemoteFiles(true).preserveTimestamp(true)
                .filter(compositeWithAcceptOnceFilter())                        .remoteDirectory(ftpProperties.getRemoteDirectory())
                .localDirectory(new File(ftpProperties.getLocalDirectory())).autoCreateLocalDirectory(true),
        consumer -> consumer.id("ftpInboundAdapter")) /* Fine from() */
        .handle(new GenericHandler<File>() {

            @Override
            @Transactional
            public Object handle(File payload, Map<String, Object> headers) {
                logger.debug("Data arrived {} {}", payload, payload.getClass().getName());
                /* handle file content here ... */
                /* ... then move it to archive */
                File dstFile = new File("archive", payload);
                FileUtils.moveFile(payload, dstFile);
                return dstFile;
            }

        }) /* Fine GenericHandler */
        /* Archive the remote file */
        .handleWithAdapter(a -> a.ftp(ftpSessionFactory())
                .remoteDirectory(ftpProperties.getRemoteArchiveDirectory()).autoCreateDirectory(true))              
        .get();

}



 类似资料:
  • 本文向大家介绍python实现ftp文件传输功能,包括了python实现ftp文件传输功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python实现ftp文件传输的具体代码,供大家参考,具体内容如下 主要步骤可以分为以下几步: 1.读取文件名 2.检测文件是否存在 3.打开文件 4.检测文件大小 5.发送文件大小和 md5值给客户端 6.等客户端确认 7.开始边读边发数据 服务

  • 我正在创建一个文件传输路径,该路径使用移动来设置一个动态路径,在成功传输文件后,文件将在该路径中移动。我还设置了一个通知程序来跟踪文件传输事件。 由于移动路径是动态的,我需要得到文件传输后移动文件的路径。该路径如何在通知程序中显示?

  • 当msg处理抛出异常时,如何有效地支持JMS重新交付? 我有一个使用JMS(ActiveMQ)的流,它具有配置为允许n次重新传递尝试的连接工厂。 我希望在处理msg时出现任何错误,导致msg在connectionFactory配置允许的情况下被放回重新交付,然后在最大重新交付尝试用尽时,交付给DLQ。与AMQ保持一致。 对一个相关SO问题的回答意味着我可能会有一个重新抛出的错误通道,它应该触发重新

  • 我对SCP协议和JSch非常陌生。我必须通过SCP从远程设备传输文件到Android。服务器端开发人员拒绝透露任何关于他们设备的信息,除了文件位置和可以用SCP访问它的根帐户。 以下是我尝试的步骤。 > 确认使用JSch和对象,我可以发送命令并读取其输出。[完整] 确认使用JSch和对象,我可以从设备传输文件。[失败] (3)失败的原因似乎是设备(服务器)没有为SFTP配置。制造者一直在说,像下面

  • 问题内容: 我想流式传输文件中包含的行,但是一旦处理完每个文件就将其移动到另一个文件夹。 当前的过程是这样的: 说明: 我创建的小号 我为他们每个人创建一个 我到线的 我打印每一行。 代码(为简单起见,省略了例外): 一旦每个文件都已被完全读取 ,是否可以 移动它 并继续处理流中的其他文件? 问题答案: 您可以将关闭动作链接到流,如果发生以下情况,该动作将自动执行: 状态文档很重要: 当在流上调用

  • 我正在使用FTP和JAVA传输文件。我正在使用Apache中的FTPClient和FTPServer。但在特定环境中,有时文件不会传输。在调用login方法之前,我从FTPClient调用enterLocalPassiveMode方法,但有时文件不会被传输。 store File方法返回“false”。 getReplyString方法返回“200命令类型可以”。 list方法返回“227”。 文