FileSystemPersistentAcceptOnceFileListFilter не работает

#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. То, что вы показываете в качестве решения, не имеет смысла и полностью не связано с опросом файлов. Вероятно, у вас возникла какая-то ошибка во время этого процесса опроса, и вы не показываете ее в соответствии с вашими журналами…