自动创建不存在的目录 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。现在一切正常。
目前我将此配置用于 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。现在一切正常。