Метод переопределения в адаптере входящего канала Spring Integration

У меня есть прослушиватель Spring Integration, где ApplicationContext выглядит следующим образом:

final AbstractApplicationContext context = new ClassPathXmlApplicationContext(

        // Spring Integration common xml
                "classpath:contexts/bp-common.xml",

                // File Upload Listener
                "classpath:contexts/bp-integration-fileupload-context.xml");

В прослушивателе интеграции Spring я хочу попросить слушателя каждый раз повторно сканировать папку. Итак, я делаю следующее:

Map< String, FileReadingMessageSource > fileReadingSourceMap = new HashMap< String, FileReadingMessageSource >( );

        fileReadingSourceMap = context.getBeansOfType( FileReadingMessageSource.class );

        List< FileReadingMessageSource > fileReadingSourceList = new ArrayList< FileReadingMessageSource >(
                fileReadingSourceMap.values( ) );

        for ( FileReadingMessageSource frms : fileReadingSourceList ) {
            frms.setScanEachPoll( true );
        }

Я установил значение scanEachPoll в true, чтобы каждый раз он снова сканировал каталог. Его работа, я видел, как он сканировал каталог каждый раз. По умолчанию это ложь.

Отредактировать переменную в классе FileReadingMessageSource не проблема. Но у меня возникла проблема с редактированием метода внутри этого класса.

В этом классе будет следующий метод:

private void scanInputDirectory() {
        List<File> filteredFiles = scanner.listFiles(directory);
        Set<File> freshFiles = new LinkedHashSet<File>(filteredFiles);
        if (!freshFiles.isEmpty()) {
            toBeReceived.addAll(freshFiles);
            if (logger.isDebugEnabled()) {
                logger.debug("Added to queue: " + freshFiles);
            }
        }
    }

Из-за моей модификации этот слушатель будет сканировать каталог каждый раз. Таким образом, toBeReceived.addAll(freshFiles); будет продолжать добавлять один и тот же файл. Я хочу сделать что-то, чтобы переопределить этот метод, чтобы я мог очистить очередь toBeReceived перед addAll().

Я считаю, что FileReadingMessageSource класс происходит от bp-integration-fileupload-context.xml .

<int-file:inbound-channel-adapter id="hostFilesOut" channel="hostFileOutChannel"
        directory="${hostfile.dir.out}" prevent-duplicates="false"
        filename-regex="${hostfile.out.filename-regex}" >
        <int:poller id="poller" cron="${poller.cron:0,4,8,12,16,20,24,28,32,36,40,44,48,52,56 * * * * * }"
            max-messages-per-poll="1" />
    </int-file:inbound-channel-adapter>

Что-нибудь, что я могу «ввести» в эту часть xml, чтобы переопределить исходный класс FileReadingMessageSource?

Или посоветуйте как лучше сделать.

Возможно, мой вопрос сбивает с толку, позвольте мне добавить сюда несколько примеров:

на самом деле это как-то так:

Оригинальная версия:

scanEachPoll по умолчанию имеет значение false.

Таким образом, метод scanInputDirectory() не будет вызываться каждый раз. Он будет звонить только тогда, когда очередь пуста.

Но теперь я меняю scanEachPoll на true. (Этот можно легко изменить)

Когда scanEachPoll имеет значение true, метод scanInputDirectory() будет вызываться каждый раз, поэтому он будет выглядеть примерно так:

1-е сканирование, добавление в очередь (1,2,3,4,5) poll(), станет (2,3,4,5) 2-е сканирование, добавление в очередь будет (2,3,4,5) + (2,3,4,5) => стать (2,2,3,3,4,4,5,5) опрос(), стать (2,3,3,4,4,5,5) 3-е сканирование, добавление в очередь станет исходной очередью + (3,4,5) ==> станет (2,3,3,4,4,5,5,3,4,5) и так далее...


person Panadol Chong    schedule 22.02.2018    source источник


Ответы (1)


Мне удается справиться с этой проблемой, создав свой собственный сканер.

который

<bean id="myDirectoryScanner" class="bp.main.myDirectoryScanner" ></bean>

Мой сканер возвращает только первый элемент:

protected File[] listEligibleFiles(File directory)
            throws IllegalArgumentException {

        File[] rootFiles = directory.listFiles();
        List<File> files = new ArrayList<File>(rootFiles.length);
        if ( rootFiles != null ) {
            files.add(rootFiles[0]);
        }
        return files.toArray(new File[files.size()]);
    }
person Panadol Chong    schedule 26.02.2018