У меня есть прослушиватель 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) и так далее...