在Spring集成中防止重新启动时出现重复

时间:2014-09-10 02:23:22

标签: spring spring-integration

我必须轮询一个目录并将条目写入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>

2 个答案:

答案 0 :(得分:2)

Artem是正确的,您也可以扩展RedisMetadataStore并在初始化时刷新数据库中没有的条目,这样您就可以使用Redis并与DB同步。但这种情况稍微融合了一些。

答案 1 :(得分:0)

  

如何确保在写入db

后创建redis条目

这是不可能的,因为FileSystemPersistentAcceptOnceFileListFilter在发送任何消息之前有效,而FileReadingMessageSource.toBeReceived为空时只有一次。当然,它会尝试在下次重启应用程序时重新获取文件,但由于RedisMetadataStore已包含这些文件的条目,因此无法执行此操作。

我认为除非根据您的JdbcFileListFilter表使用某个自定义files,否则我们不会选择任何选项。幸运的是,无论如何,你的逻辑都会以文件输入结束。