Замените файл, если он существует, не работает в Spring Integration Smb

#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/…