Spring Integration SFTP Удалить удаленный файл по требованию - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь удалить один файл из удаленной корзины SFTP, когда в моем приложении происходит определенная вещь (мы сохраняем файл в хранилище больших двоичных объектов). Я не смог этого сделать. Все, что мне удалось увидеть, - это всегда удалять файл через адаптер исходящего канала и после завершения обработки. Я использую конфигурацию Java.

Вот мой код:

@Bean
@ServiceActivator(inputChannel = "sftpDeleteChannel")
public MessageHandler deleteHandler(SftpInboundProperties properties) {
    SftpOutboundGateway SFTP = new SftpOutboundGateway(sftpSessionFactory(properties), "rm", "'" + properties.getRemoteDirectory() + "'");
    return SFTP;
}

@Gateway(requestChannel = "sftpDeleteChannel")
    Boolean delete(Message<File> file);

Это активатор службы, который облегчает ввод файла:

@Bean
@ServiceActivator(inputChannel = "sftpChannel")
public MessageHandler handler(FileProcessingService fileProcessingService) {
    return message -> {
        fileProcessingService.processFile((Message<File> message);
    };
}

Я получаю это сообщение об ошибке:

Ответное сообщение получено, но получающий поток завершился из-за исключительной ситуации при отправке сообщения запроса: ErrorMessage [payload = org.springframework.messaging.MessageHandlingException: в обработчике сообщений произошла ошибка [bean 'deleteHandler'; определяется в: 'ресурс пути к классу [com /.../ SftpInboundConfiguration.class]'; из источника: 'org.springframework.core.type.classreading. SimpleMethodMetadata@6ff37443']; вложенным исключением является org.springframework.messaging.MessagingException: не удалось выполнить в сеансе; вложенным исключением является org.springframework.core.NestedIOException: не удалось удалить файл .; Вложенное исключение 3: Отказано в предоставлении разрешения messaging.core. GenericMessagingTemplate$TemporaryReplyChannel@34d7c35d, имя_файла = COMPLETE_FILE_NAME, file_remoteDirectory = // sftp_remote, file_originalFile = / REMOTE_FILE_PATH / COMPLETE_FILE_NAME, ID = 2252eee1-6086-c9d9-c421-403f8a0bfc28, file_relativePath = COMPLETE_FILE_NAME, file_remoteFile = COMPLETE_FILE_NAME, временная метка = 1588177024991}] , заголовки = {ID = 0d2b19ca-0e7 c -7ba8-58cf-f225c126048 c, временная метка = 1588177025001}] для оригинального GenericMessage [полезной нагрузки = / REMOTE_FILE_PATH / COMPLETE_FILE_NAME, заголовки = {file_remoteHostPort = 127.0.0.1: 2222, имя_файла = COMPLETE_FILE_NAME, file_remoteDirectory = // sftp_remote, file_originalFile = / REMOTE_FILE_PATH / COMPLETE_FILE_NAME, id = 9f29dd04-362a-ae93-df97-b392572d8864_файл_файла_или_файла_или_файла_файла_файла_файла_файла 23713}]

Я не уверен, что делаю что-то неправильно или исходящие шлюзы не предназначены для указания c, удаления по требованию или того и другого. Хотелось бы помочь.

Спасибо!

Редактировать:

Я могу удалить файлы на сервере с помощью SftpInboundFileSynchronizer.setDeleteRemoteFiles (true), так что в отношении корзины sftp я можете удалять файлы. Нужно ли что-то изменить в моем InboundChannelAdapter? Вот оно ниже:

@Bean
@InboundChannelAdapter(channel = "sftpChannel", poller = @Poller(fixedDelay = "${com.esrx.dhf.listener.sftp.inbound.poll-interval:5000}"))
    public MessageSource<File> sftpMessageSource(SftpInboundProperties properties, JdbcMetadataStore metadataStore) {
        SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(
                sftpInboundFileSynchronizer(properties, metadataStore));
        source.setLocalDirectory(new File(System.getProperty("user.dir") + "/" + "sftp_local"));
        source.setAutoCreateLocalDirectory(true);
        source.setMaxFetchSize(1);
        source.setLocalFilter(new FileSystemPersistentAcceptOnceFileListFilter(metadataStore, SFTP_LOCAL_PERSISTENT_PREFIX));
        return source;
    }

РЕДАКТИРОВАТЬ: РЕШЕНО

Таким образом, реальный ответ почтенного Гэри Рассела состоял в том, что я должен указать полный путь к файлу в SftpOutboundGateway. Теперь рабочее решение означает, что новый OutboundGateway выглядит следующим образом:

@Bean
@ServiceActivator(inputChannel = "sftpDeleteChannel")
public MessageHandler deleteHandler(SftpInboundProperties properties) {
    return new SftpOutboundGateway(
            sftpSessionFactory(properties),
            "rm", 
            "'" + properties.getRemoteDirectory() + "/'" + " + " + "headers['file_remoteFile']");
    }

1 Ответ

0 голосов
/ 29 апреля 2020

То, что у вас есть, правильно.

См. Причину:

Вложенное исключение 3: Отказано в доступе,

У вас нет разрешение на удаление файла.

...