У меня есть несколько потоков, которые загружают файлы sftp через Sftp.outboundAdapter
. Каждый поток должен создать путь к каталогу с общим корнем. Я получаю исключение, которое говорит мне, что общий корень существует:
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
имеет значение true?