我必须轮询一个目录并将条目写入rdbms。 我连接了一个redis metadatstore进行重复检查。我看到框架使用文件夹[~140个文件]中的所有文件的条目更新redis存储,远在rdbms条目写入之前。在应用程序终止时,rdbms只记录了90个文件。在应用程序重新启动时,不会从文件夹中选择更多文件。
属性:msgs.per.poll = 10,polling.interval = 2000 如何确保在写入db之后进行redis条目,这样两者都是同步的,我不会错过任何文件。
<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 :(得分:2)
Artem是正确的,您也可以扩展RedisMetadataStore并在初始化时刷新数据库中没有的条目,这样您就可以使用Redis并与DB同步。但这种情况稍微融合了一些。
答案 1 :(得分:0)
如何确保在写入db
后创建redis条目
这是不可能的,因为FileSystemPersistentAcceptOnceFileListFilter
在发送任何消息之前有效,而FileReadingMessageSource.toBeReceived
为空时只有一次。当然,它会尝试在下次重启应用程序时重新获取文件,但由于RedisMetadataStore
已包含这些文件的条目,因此无法执行此操作。
我认为除非根据您的JdbcFileListFilter
表使用某个自定义files
,否则我们不会选择任何选项。幸运的是,无论如何,你的逻辑都会以文件输入结束。