Spring Integration + Адаптер входящего канала + Рекурсивный сканер каталогов - PullRequest
0 голосов
/ 23 апреля 2020

Адаптер входящего канала создается с помощью средства опроса, чтобы опрашивать файлы, присутствующие в каталоге root и его подкаталогах

e.g.  

RootDir 
|_abc.txt
|_subdirectory1
  |_subdirfile1.doc

Проблема в том, что адаптер входящего канала считывает каталог также как сообщение

@Bean
@InboundChannelAdapter(autoStartup = "false", value = "incomingchannel", poller = @Poller("custompoller"))
    public MessageSource<File> fileReadingMessageSource(DirectoryScanner directoryScanner) {

    FileReadingMessageSource sourceReader = new FileReadingMessageSource();
sourceReader.setScanner(directoryScanner);

}

@Bean
    public DirectoryScanner directoryScanner() {
        DirectoryScanner scanner = new RecursiveDirectoryScanner();
        CompositeFileListFilter filter = new CompositeFileListFilter<>(
                Arrays.asList(new AcceptOnceFileListFilter<>(), new RegexPatternFileListFilter(regex)));
        scanner.setFilter(filter);
        return scanner;
    }

@Trasnformer(inputChannel="incomingchannel",....
torequest(Mesage<File> message) { 

        message.getPayload()

}

Здесь message.getpayLoad печатает подкаталог1, т. Е. Каталог также читается как файл сообщения

Я могу явно обработать, как файл является каталогом или нет в trasnformer и игнорировать, но хотел бы знать, есть ли какой-либо способ его можно отфильтровать в сканере рекурсивных каталогов, подключенном к адаптеру входящего канала?

1 Ответ

1 голос
/ 23 апреля 2020

Эта проблема, вероятно, связана с этим потоком SO: Spring Integration + источник сообщения о чтении файла _ Адаптер входящего канала + Исходящий шлюз .

Вам нужно дважды подумать, если вы в порядке, проигрывая Файловое дерево. Мне показалось, что вы хотите восстановить дерево в FileWritingMessageHandler. Так что, вероятно, лучше @Filter сообщений с полезной нагрузкой каталога перед отправкой в ​​этот преобразователь.

Если вы все еще хотите пропустить каталоги из источника, рассмотрите возможность использования ChainFileListFilter вместо CompositeFileListFilter и сначала настройте RegexPatternFileListFilter. Таким образом, отфильтрованный каталог из RegexPatternFileListFilter (по умолчанию он пропускается, см. AbstractDirectoryAwareFileListFilter) вообще не будет go до AcceptOnceFileListFilter. В вашей текущей конфигурации AcceptOnceFileListFilter существо сначала принимает каталог и действительно игнорирует следующий фильтр в композиции.

ОБНОВЛЕНИЕ

То, что я имею в виду, должно быть таким:

@Bean
public DirectoryScanner directoryScanner() {
    DirectoryScanner scanner = new RecursiveDirectoryScanner();
    ChainFileListFilter filter = new ChainFileListFilter<>(
            Arrays.asList(new RegexPatternFileListFilter(regex), new AcceptOnceFileListFilter<>()));
    scanner.setFilter(filter);
    return scanner;
}

Больше ничего. Пока ваш regex предназначен только для файлов, любой подкаталог будет пропущен и не будет допущен к go downstream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...