Проблема в том, что опрошенные файлы хранятся во внутренней FileSystemPersistentAcceptOnceFileListFilter
для SftpInboundFileSynchronizingMessageSource
.
Вам необходимо настроить внешний компонент следующим образом:
@Bean
public FileSystemPersistentAcceptOnceFileListFilter localFilefilter() {
return new FileSystemPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "sftpFiles");
}
Затем введите это так:
source.setLocalFilter(localFilefilter());
Когда происходит исключение из файла, сохраняемого в БД, вам просто нужно вызвать метод delete()
этого фильтра с файлом, который вы не можете сохранить. См ResettableFileListFilter
:
/**
* A {@link FileListFilter} that can be reset by removing a specific file from its
* state.
* @author Gary Russell
* @since 4.1.7
*
*/
public interface ResettableFileListFilter<F> extends FileListFilter<F> {
/**
* Remove the specified file from the filter so it will pass on the next attempt.
* @param f the element to remove.
* @return true if the file was removed as a result of this call.
*/
boolean remove(F f);
}
Я могу предположить, что ваш SftpFileHandler
выполняет эту тяжелую работу, поэтому вы можете настроить adviceChain
для его @ServiceActivator
с ExpressionEvaluatingRequestHandlerAdvice
и настроить его failureChannel
для выполнения упомянутой операции delete()
.
Таким образом, необработанный файл будет снова опрашиваться из SFTP в следующем цикле опроса.
Другой способ достижения цели - использовать retry . Для этой цели вы можете использовать RequestHandlerRetryAdvice
по той же причине @ServiceActivator.adviceChain()
. В этом случае один и тот же файл будет пытаться снова и снова сохраняться в БД без какой-либо необходимой логики обработки ошибок.
См. Дополнительную информацию в Справочном руководстве: https://docs.spring.io/spring-integration/reference/html/#message-handler-advice-chain, а также: https://docs.spring.io/spring-integration/reference/html/#recovering-from-failures-2