Похоже, вы говорите о том же файле. В этом случае удаление его из локального каталога недостаточно. В процессе участвуют несколько FileListFilter
экземпляров, которые содержат запись для обработанного файла. И в соответствии с вашей конфигурацией вы имеете дело с вариантами в памяти. Они действительно ничего не знают о вашем локальном удалении файла.
Если быть точным, есть два фильтра, о которых вам нужно беспокоиться: FtpPersistentAcceptOnceFileListFilter
для удаленной записи и FileSystemPersistentAcceptOnceFileListFilter
для локальной копии файла. Оба они реализуют ResettableFileListFilter
, поэтому вы можете вызывать их remove()
всякий раз, когда выполняете файловый процесс.
FtpInboundChannelAdapterSpec
в Java DSL имеет следующие параметры:
/**
* Configure a {@link FileListFilter} to be applied to the remote files before
* copying them.
* @param filter the filter.
* @return the spec.
*/
public S filter(FileListFilter<F> filter) {
/**
* A {@link FileListFilter} used to determine which files will generate messages
* after they have been synchronized.
* @param localFileListFilter the localFileListFilter.
* @return the spec.
* @see AbstractInboundFileSynchronizingMessageSource#setLocalFilter(FileListFilter)
*/
public S localFilter(FileListFilter<File> localFileListFilter) {
Таким образом, у вас все еще могут быть упомянутые фильтры по умолчанию, но вы извлекаете их в виде bean-компонентов и внедряете в эти параметры и в свой directoryCleaner
, чтобы также выполнить удаление из этих фильтров.
Существует также опциянапример:
/**
* Switch the local {@link FileReadingMessageSource} to use its internal
* {@code FileReadingMessageSource.WatchServiceDirectoryScanner}.
* @param useWatchService the {@code boolean} flag to switch to
* {@code FileReadingMessageSource.WatchServiceDirectoryScanner} on {@code true}.
* @since 5.0
*/
public void setUseWatchService(boolean useWatchService) {
И событие DELETE
также настроено для наблюдателя. Когда это происходит, удаленный файл также удаляется из локального фильтра.
Вы также можете правильно обращаться с удаленным файлом при настройке:
/**
* Set to true to enable the preservation of the remote file timestamp when transferring.
* @param preserveTimestamp true to preserve.
* @return the spec.
*/
public S preserveTimestamp(boolean preserveTimestamp) {
Таким образом, более новый файл с тем жеимя будет рассматриваться как другой файл, а его запись в упомянутых фильтрах будет перезаписана. Хотя я вижу, что вы уже используете его, но вы все еще жалуетесь, что это не работает. Это может быть в случае со старой версией Spring Integration, когда FileSystemPersistentAcceptOnceFileListFilter
не использовался для локальных файлов.