Как использовать integrationFlows для новых файлов?

Я следил за учебником о том, как слушать папку с интеграцией Spring и SseEmitter. Теперь у меня есть этот код:

@Bean
IntegrationFlow inboundFlow ( @Value("${input-dir:file:C:\\Users\\kader\\Desktop\\Scaned\\}") File in){
    return IntegrationFlows.from(Files.inboundAdapter(in).autoCreateDirectory(true),
            poller -> poller.poller(spec -> spec.fixedRate(1000L)))
            .transform(File.class, File::getAbsolutePath)
            .handle(String.class, (path, map) -> {
                sses.forEach((sse) -> {
                    try {
                        String p = path;
                        sse.send(SseEmitter.event().name("spring").data(p));
                    }
                    catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                });
                return null ;
            })
            .get();
}

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

1
0
436
1

Ответы 1

Ну, на самом деле, поскольку вы не настраиваете никаких фильтров на Files.inboundAdapter(), есть такая логика:

    // no filters are provided
    else if (Boolean.FALSE.equals(this.preventDuplicates)) {
        filtersNeeded.add(new AcceptAllFileListFilter<File>());
    }
    else { // preventDuplicates is either TRUE or NULL
        filtersNeeded.add(new AcceptOnceFileListFilter<File>());
    }

Поэтому применяется AcceptOnceFileListFilter, и никакие уже опрошенные файлы не будут выбраны в последующих задачах опроса.

Однако вы действительно можете говорить о чем-то вроде «после перезапуска приложения», так что да, в этом случае все файлы будут извлечены.

Я считаю, что вам нужно изучить, что такое FileListFilter, и использовать подходящий для вашего случая использования: https://docs.spring.io/spring-integration/docs/current/reference/html/files.html#file-reading

Спасибо, вы говорите, что Files.inboundAdapter () не прослушивает событие, а просто извлекает файлы и принимает фильтры для сопоставления

Kader Moulay Ely 10.08.2018 19:50

Верный. Это происходит периодически. Что ж, вы можете подумать об использовании useWatchService(true), если вы действительно предвзято относитесь к событиям ...

Artem Bilan 10.08.2018 19:51

вы имеете в виду WatchService вместо весенней интеграции? Я думал об этом, идет ли это вместе с событиями, отправленными весенним сервером?

Kader Moulay Ely 10.08.2018 19:55

??? Я не понимаю твоего беспокойства. useWatchService(true) является частью Files.inboundAdapter(). Вместо этого вы ничего не должны использовать.

Artem Bilan 10.08.2018 19:59

Большой! Итак, пора принять ответ: stackoverflow.com/help/someone-answers?

Artem Bilan 10.08.2018 20:28

Я сделал это, но моя репутация не позволяет моему голосованию изменить порядок, но он все равно записывается

Kader Moulay Ely 10.08.2018 22:16

не могли бы вы предоставить мне несколько примеров использования useWatchService (true) Я пробовал, но ничего не изменилось

Kader Moulay Ely 10.08.2018 23:04

В чем твоя проблема так? Вы можете просто объяснить, как воспроизвести?

Artem Bilan 11.08.2018 06:10

Моя проблема в том, что «мне нужно только получать уведомления о событии CREATE, это мой вариант использования», и я использовал watchEvents (FileReadingMessageSource.WatchEventType.CREATE), но, похоже, ничего не изменилось

Kader Moulay Ely 11.08.2018 21:25

другими словами: как я могу заставить его игнорировать начальный список файлов в каталоге?

Kader Moulay Ely 12.08.2018 00:23

Что ж, я считаю, что вы можете сделать это с LastModifiedFileListFilter.

Artem Bilan 12.08.2018 02:12

Как установить в нем возраст, чтобы отфильтровать файлы, которые были там до запуска приложения

Kader Moulay Ely 12.08.2018 03:10

Что ж, это уже ваше бизнес-решение: Framework не может сделать этого за вас.

Artem Bilan 12.08.2018 03:14

Я знаю, что мне просто интересно, можете ли вы предоставить мне некоторую документацию, чтобы я мог использовать ее со своим вариантом использования, и спасибо

Kader Moulay Ely 12.08.2018 03:22

Я читаю это. LastModifiedFileListFilter фильтрует файлы, которые слишком молоды для указанного возраста, но не обрабатывает слишком старые файлы, что, похоже, не помогает в моем случае.

Kader Moulay Ely 12.08.2018 03:38

Да, есть и другие фильтры на ваш выбор,

Artem Bilan 12.08.2018 03:39

См. FileSystemPersistentAcceptOnceFileListFilter

Artem Bilan 12.08.2018 03:46

Я считаю, что это может мне помочь, я понимаю, что он хранится в метаданных, но какой параметр префикса для

Kader Moulay Ely 12.08.2018 03:51

Просто чтобы отличить один фильтр от другого, когда они разделяют хранилище

Artem Bilan 12.08.2018 03:53

Другие вопросы по теме