#spring-integration
Вопрос:
Я пытаюсь записать файлы в папку smb, это нормально работает при первой записи, но когда тот же файл записывается снова, он выдает ошибку
Вызвано: org.springframework.core.Исключение NestedIOException: Не удалось переименовать [/remote-target-dir/smbTest.test.запись] в [/remote-target-dir/smbTest.test].; вложенным исключением является исключение jcifs.smb.SmbException: Не удается создать файл, когда этот файл уже существует.
Я использую FileTransferringMessageHandler
режим, в котором FileExistsMode.REPLACE
по умолчанию существует файл, но его все равно не удается заменить.
Я отладился в SmbSession
классе, когда поток достигает этого кода в rename(String _pathFrom, String _pathTo)
методе
if (this.smbShare.isReplaceFile() amp;amp; smbFileTo.exists()) {
smbFileTo.delete();
}
Я вижу, что значение smbShare
» s isReplaceFile()
» является ложным, поэтому я предполагаю, что он не может удалить предыдущий файл с тем же именем
Вот полный код:
Соединение:
@Bean
public SmbSessionFactory smbSessionFactory() {
SmbSessionFactory smbSession = new SmbSessionFactory();
smbSession.setHost("localhost");
smbSession.setPort(445);
smbSession.setDomain("DESKTOP-07O79IT");
smbSession.setUsername("Dell");
smbSession.setPassword("changeIt");
smbSession.setShareAndDir("Users\DELL\Desktop\Shared");
smbSession.setSmbMinVersion(DialectVersion.SMB210);
smbSession.setSmbMaxVersion(DialectVersion.SMB311);
return smbSession;
}
Исходящие для отправки файлов в smb:
@ServiceActivator(inputChannel = "storeToSmb")
@Bean
public MessageHandler smbMessageHandler(SmbSessionFactory smbSessionFactory) {
FileTransferringMessageHandler<SmbFile> handler =
new FileTransferringMessageHandler<>(smbSessionFactory);
handler.setRemoteDirectoryExpression(
new LiteralExpression("/remote-target-dir"));
handler.setFileNameGenerator(m -> "smbTest.test");
handler.setAutoCreateDirectory(true);
return handler;
}
Ворота:
@Override
public void run(ApplicationArguments args) throws Exception {
File file = new File("smbFile.txt");
try(FileWriter writer = new FileWriter(file)){
writer.write("This is sample smb write");
messageGateway.storeToSmb(file);
}catch (IOException e){
System.out.println("Error: " e);
}
}
Не могли бы вы, пожалуйста, помочь с этим вопросом?
Ответ №1:
То SmbSessionFactory
должно прийти вместе с тем setReplaceFile(true)
. Он FileTransferringMessageHandler
ничего не делает со своей зависимостью и не может ее изменить, хотя в этом есть своя логика FileExistsMode.REPLACE
.
Комментарии:
1. Спасибо, это сработало, но почему у объекта сеанса есть опция замены файла по какой-либо конкретной причине? В сеансах sftp/ftp такой опции нет.
2. Да… Я понимаю вашу точку зрения. Согласно истории Git, эта
repace
опцияSmbShare
была введена в том же году,FileExistsMode.REPLACE
что и . Поскольку на самом деле нет никаких особых причин для его использования в логике сеанса, а скорее больше контролировать его с помощью обработчика передачи, плюс полагаться на возможный сбой от SMB, если мы действительно не сможем заменить, я бы предложил поднять проблему GH в проекте Spring Integration Extensions, чтобы отказаться от этой опции и удалить в будущем.3. GH вопрос по этому вопросу: github.com/spring-projects/spring-integration-extensions/issues/…