自动创建不存在的目录 Spring 集成 SFTP

Auto create not existing directory Spring Integration SFTP

目前我将此配置用于 Spring 集成 SFTP:

@Bean
  @ServiceActivator(inputChannel = "toSftpChannel")
  public MessageHandler handler() {
    final SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
    handler.setRemoteDirectoryExpressionString("\'" + properties.getFolder() + "\'"
        + ".concat(headers['region'])");
    handler.setAutoCreateDirectory(true);
    return handler;
  }

一切正常,但有时我会遇到异常

MessageDeliveryException: Failed to transfer file [/test/home-dir/feed.xml -> feed.xml] from local directory to remote directory.; nested exception is org.springframework.core.NestedIOException: failed to create remote directory '/test-sftp'.; nested exception is 4: 
    at org.springframework.integration.file.remote.RemoteFileTemplate.doSend(RemoteFileTemplate.java:347)
    at org.springframework.integration.file.remote.RemoteFileTemplate.lambda$send[=12=](RemoteFileTemplate.java:298)
    at org.springframework.integration.file.remote.RemoteFileTemplate.execute(RemoteFileTemplate.java:437)
    at org.springframework.integration.file.remote.RemoteFileTemplate.send(RemoteFileTemplate.java:298)
    at org.springframework.integration.file.remote.RemoteFileTemplate.send(RemoteFileTemplate.java:286)
    at org.springframework.integration.file.remote.RemoteFileTemplate.send(RemoteFileTemplate.java:278)
    at org.springframework.integration.file.remote.handler.FileTransferringMessageHandler.handleMessageInternal(FileTransferringMessageHandler.java:205)

主要问题是,我已经有了目录 /test-sftp,奇怪的是,在 properties.getFolder() (application.properties) 中我设置了 /test-sftp/dir/,但在大约一半的路径中出现异常。怎么可能? 我的目标是从创作中排除这部分路径。是否可以仅从 headers['region'] 创建目录。 例子。我有 /test-sftp/dir/,只需要创建 /test-sftp/dir/one /test-sftp/dir/two。但是,如果来自 /test-sftp/dir/ 的目录不存在,那么就会失败。

P.S。我拥有所有访问权限,但 100 次中只有 5 次无法将文件上传到 SFTP(所有目录都存在)。

您需要显示整个堆栈跟踪;不要在此处截断堆栈跟踪。

but get an exception about half of the path.

SFTP 不支持一步创建目录树;我们必须递归地创建它们。参见 RemoteFileUtils.makeDirectories()

已解决。我们使用了有很多防火墙的客户 SFTP。我们有 Caused By: Pipe Closed,所以,似乎 sftp close long 运行 open sessions 和 spring integration sftp 没有快速实现它。 因此,解决方案是暂时删除 CachingSessionFactory。现在一切正常。