Spring-Integration: многопоточное создание каталогов sftp с общим корневым сбоем - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть несколько потоков, которые загружают файлы 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?

1 Ответ

1 голос
/ 30 апреля 2019

Возможный обходной путь - заранее создать общий путь, но это неуклюже, поскольку в Sftp.outboundGateway такой команды нет

Вы можете просто вызвать RemoteFileUtils.makeDirectories самостоятельново время инициализации (получение сеанса через SftpRemoteFileTemplate.execute(session -> ...)).

Однако я согласен, что утилита должна перехватить и игнорировать это исключение.Пожалуйста, откройте вопрос на GitHub .

Вклад приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...