Я следил за учебником о том, как слушать папку с интеграцией 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();
}
и он работает, но он отправляет все файлы в указанном каталоге, включая файлы, которые уже существуют, есть ли способ заставить его игнорировать их и отправлять только новые файлы ???
Ну, на самом деле, поскольку вы не настраиваете никаких фильтров на 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
Верный. Это происходит периодически. Что ж, вы можете подумать об использовании useWatchService(true), если вы действительно предвзято относитесь к событиям ...
вы имеете в виду WatchService вместо весенней интеграции? Я думал об этом, идет ли это вместе с событиями, отправленными весенним сервером?
??? Я не понимаю твоего беспокойства. useWatchService(true) является частью Files.inboundAdapter(). Вместо этого вы ничего не должны использовать.
Большой! Итак, пора принять ответ: stackoverflow.com/help/someone-answers?
Я сделал это, но моя репутация не позволяет моему голосованию изменить порядок, но он все равно записывается
не могли бы вы предоставить мне несколько примеров использования useWatchService (true) Я пробовал, но ничего не изменилось
В чем твоя проблема так? Вы можете просто объяснить, как воспроизвести?
Моя проблема в том, что «мне нужно только получать уведомления о событии CREATE, это мой вариант использования», и я использовал watchEvents (FileReadingMessageSource.WatchEventType.CREATE), но, похоже, ничего не изменилось
другими словами: как я могу заставить его игнорировать начальный список файлов в каталоге?
Что ж, я считаю, что вы можете сделать это с LastModifiedFileListFilter.
Как установить в нем возраст, чтобы отфильтровать файлы, которые были там до запуска приложения
Что ж, это уже ваше бизнес-решение: Framework не может сделать этого за вас.
Я знаю, что мне просто интересно, можете ли вы предоставить мне некоторую документацию, чтобы я мог использовать ее со своим вариантом использования, и спасибо
Я читаю это. LastModifiedFileListFilter фильтрует файлы, которые слишком молоды для указанного возраста, но не обрабатывает слишком старые файлы, что, похоже, не помогает в моем случае.
Да, есть и другие фильтры на ваш выбор,
См. FileSystemPersistentAcceptOnceFileListFilter
Я считаю, что это может мне помочь, я понимаю, что он хранится в метаданных, но какой параметр префикса для
Просто чтобы отличить один фильтр от другого, когда они разделяют хранилище
Спасибо, вы говорите, что Files.inboundAdapter () не прослушивает событие, а просто извлекает файлы и принимает фильтры для сопоставления