Spring-集成:多线程创建具有公共根目录的 sftp 目录失败
Spring-Integration: multithreaded creation of sftp directories with common root fails
我有多个线程通过 Sftp.outboundAdapter
上传 sftp 文件。每个线程都需要创建一个具有公共根的目录路径。我得到一个异常,它告诉我存在公共根:
org.springframework.messaging.MessageDeliveryException: Failed to transfer file
...
Caused by: org.springframework.core.NestedIOException: failed to create remote directory '/my/import/de3fb731-6a56-11e9-bfd2-0242ac140022'.; nested exception is 4: Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist.
at org.springframework.integration.sftp.session.SftpSession.mkdir(SftpSession.java:232)
at org.springframework.integration.file.remote.RemoteFileUtils.makeDirectories(RemoteFileUtils.java:71)
at org.springframework.integration.file.remote.RemoteFileTemplate.sendFileToRemoteDirectory(RemoteFileTemplate.java:545)
at org.springframework.integration.file.remote.RemoteFileTemplate.doSend(RemoteFileTemplate.java:337)
... 150 common frames omitted
Caused by: com.jcraft.jsch.SftpException: Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist.
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2873)
at com.jcraft.jsch.ChannelSftp.mkdir(ChannelSftp.java:2182)
at org.springframework.integration.sftp.session.SftpSession.mkdir(SftpSession.java:229)
... 153 common frames omitted
我猜 RemoteFileUtils#makeDirectories
在确定 pathsToCreate
时存在竞争条件。两个线程都确定需要创建路径段,但是当都尝试创建它时,第二个线程失败了。
一种可能的解决方法是提前创建公共路径,但这很笨拙,因为 Sftp.outboundGateway
中没有这样的命令,看来我必须上传一个带有 autoCreateDirectories
的虚拟文件然后删除虚拟文件。
有没有更好的方法解决这个问题?将 mkdirs 命令添加到 sftp 出站网关是否有意义?当 autoCreateDirectories
为真时,是否应该有一个标志来忽略由于现有目录引起的错误?
A possible workaround is to create the common path in advance, but that is clumsy because there is no such command in the Sftp.outboundGateway
您可以在初始化期间简单地自己调用 RemoteFileUtils.makeDirectories
(通过 SftpRemoteFileTemplate.execute(session -> ...)
获取会话)。
但是,我同意该实用程序应该捕获并忽略该异常。请打开一个issue on GitHub。
欢迎投稿。
我有多个线程通过 Sftp.outboundAdapter
上传 sftp 文件。每个线程都需要创建一个具有公共根的目录路径。我得到一个异常,它告诉我存在公共根:
org.springframework.messaging.MessageDeliveryException: Failed to transfer file
...
Caused by: org.springframework.core.NestedIOException: failed to create remote directory '/my/import/de3fb731-6a56-11e9-bfd2-0242ac140022'.; nested exception is 4: Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist.
at org.springframework.integration.sftp.session.SftpSession.mkdir(SftpSession.java:232)
at org.springframework.integration.file.remote.RemoteFileUtils.makeDirectories(RemoteFileUtils.java:71)
at org.springframework.integration.file.remote.RemoteFileTemplate.sendFileToRemoteDirectory(RemoteFileTemplate.java:545)
at org.springframework.integration.file.remote.RemoteFileTemplate.doSend(RemoteFileTemplate.java:337)
... 150 common frames omitted
Caused by: com.jcraft.jsch.SftpException: Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist.
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2873)
at com.jcraft.jsch.ChannelSftp.mkdir(ChannelSftp.java:2182)
at org.springframework.integration.sftp.session.SftpSession.mkdir(SftpSession.java:229)
... 153 common frames omitted
我猜 RemoteFileUtils#makeDirectories
在确定 pathsToCreate
时存在竞争条件。两个线程都确定需要创建路径段,但是当都尝试创建它时,第二个线程失败了。
一种可能的解决方法是提前创建公共路径,但这很笨拙,因为 Sftp.outboundGateway
中没有这样的命令,看来我必须上传一个带有 autoCreateDirectories
的虚拟文件然后删除虚拟文件。
有没有更好的方法解决这个问题?将 mkdirs 命令添加到 sftp 出站网关是否有意义?当 autoCreateDirectories
为真时,是否应该有一个标志来忽略由于现有目录引起的错误?
A possible workaround is to create the common path in advance, but that is clumsy because there is no such command in the Sftp.outboundGateway
您可以在初始化期间简单地自己调用 RemoteFileUtils.makeDirectories
(通过 SftpRemoteFileTemplate.execute(session -> ...)
获取会话)。
但是,我同意该实用程序应该捕获并忽略该异常。请打开一个issue on GitHub。
欢迎投稿。