2014-09-10 3 views
2

Мне нужно опросить каталог и записать записи в rdbms. Я подключил метаданный для redis для проверки дубликатов. Я вижу, что инфраструктура обновляет хранилище redis с записями для всех файлов в папке [~ 140 файлов], задолго до того, как записи rdbms будут записаны. Во время завершения приложения rdbms зарегистрировал только 90 файлов. При перезагрузке приложения из папки больше не выбрано файлов.Предотвращение дублирования между перезапусками в интеграции весов

Свойства: msgs.per.poll = 10, polling.interval = 2000 Как я могу гарантировать, что записи для redis создаются после записи в db, так что оба синхронизированы, и я не пропускаю никаких файлов.

<code> 
    <task:executor id="executor" pool-size="5" /> 
    <int-file:inbound-channel-adapter channel="filesIn" directory="${input.Dir}" scanner="dirScanner" filter="compositeFileFilter" prevent-duplicates="true"> 
     <int:poller fixed-delay="${polling.interval}" max-messages-per-poll="${msgs.per.poll}" task-executor="executor"> 
     </int:poller> 
    </int-file:inbound-channel-adapter> 
    <int:channel id="filesIn" /> 

    <bean id="dirScanner" class="org.springframework.integration.file.RecursiveLeafOnlyDirectoryScanner" /> 

    <bean id="compositeFileFilter" class="org.springframework.integration.file.filters.CompositeFileListFilter"> 
     <constructor-arg ref="persistentFilter" /> 
    </bean> 

    <bean id="persistentFilter" class="org.springframework.integration.file.filters.FileSystemPersistentAcceptOnceFileListFilter"> 
     <constructor-arg ref="metadataStore" /> 
    </bean> 

    <bean name="metadataStore" class="org.springframework.integration.redis.metadata.RedisMetadataStore"> 
     <constructor-arg name="connectionFactory" ref="redisConnectionFactory"/> 
    </bean> 
    <bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:hostName="localhost" p:port="6379" /> 

    <int-jdbc:outbound-channel-adapter channel="filesIn" data-source="dataSource" query="insert into files values (:path,:name,:size,:crDT,:mdDT,:id)" 
     sql-parameter-source-factory="spelSource"> 
    </int-jdbc:outbound-channel-adapter> 

     .... 
</code> 

ответ

0

Как я могу гарантировать записи в Redis сделаны после записи в БД

Это не является возможным, потому что FileSystemPersistentAcceptOnceFileListFilter работает до любого отправки сообщения и только один раз, когда FileReadingMessageSource.toBeReceived пуст. Конечно, он пытается восстановить файлы при следующем перезапуске приложения, но не может этого сделать, потому что ваш RedisMetadataStore уже содержит записи для этих файлов.

Я думаю, что у нас нет в вашем случае никакого выбора, если вы не используете какой-либо пользовательский JdbcFileListFilter на основе вашей таблицы files. К счастью, логика заканчивается записью файла.

2

Artem правильно, вы можете также расширить RedisMetadataStore и очистить записи, отсутствующие в вашей базе данных во время инициализации, таким образом вы можете использовать Redis и быть в синхронизации с БД. Но такого рода пары немного.

Смежные вопросы