#spring #spring-boot #spring-integration
#spring #весенняя загрузка #spring-интеграция
Вопрос:
Я использую FileSystemPersistentAcceptOnceFileListFilter, чтобы добиться параллелизма при выборе файлов из общего общего каталога. Я хочу, чтобы 2 экземпляра службы одновременно загружали разные файлы. Однако файлы выбираются одним экземпляром; не вторым экземпляром
Использование spring boot 2
@Bean("filterFiles")
public FileListFilter<File> filterFiles() {
/**
* with accept once file list filter if the file is processed
* it will not be processed again . This will require service restart
* this done for concurrency since we dont want same file to processed again by different threads
*
*/
ChainFileListFilter<File> filters = new ChainFileListFilter<File>();
filters.addFilter(new FileSystemPersistentAcceptOnceFileListFilter(redisMetaDataStore(), "rci-files"));
filters.addFilter(new SimplePatternFileListFilter("*.xml"));
}
@Bean
ConcurrentMetadataStore redisMetaDataStore() {
return new RedisMetadataStore(dmsRedisConnectionFactory(), "rci");
}
@Bean
public JedisClientConfigurationBuilder jedisClientConfigurationBuilder() {
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxIdle(redismaxIdle);
jpc.setMaxTotal(redisMaxTotal);
JedisClientConfigurationBuilder jccb = JedisClientConfiguration.builder();
jccb.connectTimeout(Duration.ofSeconds(redisTimeout));
jccb.readTimeout(Duration.ofSeconds(redisTimeout));
jccb.usePooling().poolConfig(jpc);
jccb.useSsl();
return jccb;
}
@Bean
public RedisConnectionFactory dmsRedisConnectionFactory() {
RedisStandaloneConfiguration standaloneConfig = new RedisStandaloneConfiguration(dmsRedisHost, dmsRedisPort);
standaloneConfig.setPassword(RedisPassword.of(dmsRedisPassword));
JedisConnectionFactory factory = new JedisConnectionFactory(standaloneConfig, jedisClientConfigurationBuilder().build());
return factory;
}
и xml
<int-file:inbound-channel-adapter directory="${rnr.file.directory}" auto-startup="true"
filter="filterFiles" channel="filesIn">
<integration:poller
cron="*/10 * 0-17,18-23 * * ?"
task-executor="largeFileTaskExecutor"
max-messages-per-poll="${max-messages}"/>
</int-file:inbound-channel-adapter>
<integration:service-activator input-channel="filesIn" output-channel="toArchive"
ref="processSingleLargeFile" method="process"></integration:service-activator>
Комментарии:
1. Вы пробовали отлаживать свой
ChainFileListFilter
модульный тест?2. Что это значит: «Однако файлы не извлекаются из файлов
? Any chances to see some logs for your application? Are you sure that
LastModifiedFileListFilter(0)` подходит для вашей логики? Очищаете ли вы хранилище Redis перед перезапуском своего приложения?3. Удален LastModifiedFileListFilter(0) по-прежнему файлы не выбираются. В начальной точке функции, в которой выбран файл, есть журнал
4. Нет, я не очищаю хранилище redis перед перезапуском своего приложения
5. То, что вы показываете в качестве решения, не имеет смысла и полностью не связано с опросом файлов. Вероятно, у вас возникла какая-то ошибка во время этого процесса опроса, и вы не показываете ее в соответствии с вашими журналами…