【问题标题】:Prevent duplicates across restarts in spring integration在 Spring 集成中防止重复重启
【发布时间】:2014-09-10 02:23:22
【问题描述】:

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

【问题讨论】:

    标签: spring spring-integration


    【解决方案1】:

    Artem 是正确的,您不妨扩展 RedisMetadataStore 并在初始化时刷新不在数据库中的条目,这样您就可以使用 Redis 并与数据库同步。但是这种夫妻关系有点小。

    【讨论】:

      【解决方案2】:

      如何确保在写入 db 后生成 redis 条目

      这是不可能的,因为FileSystemPersistentAcceptOnceFileListFilter 在发送任何消息之前有效,并且只有一次,当FileReadingMessageSource.toBeReceived 为空时。当然,它会尝试在下次应用程序重新启动时重新获取文件,但它不能这样做,因为您的 RedisMetadataStore 已经包含这些文件的条目。

      我认为在您的情况下我们没有任何选择,除非根据您的 files 表使用一些自定义的 JdbcFileListFilter。幸运的是,您的逻辑最终还是以文件条目结束。

      【讨论】:

        猜你喜欢
        • 2021-03-18
        • 2021-05-23
        • 1970-01-01
        • 2014-02-04
        • 2016-03-20
        • 2014-05-11
        • 1970-01-01
        • 2016-03-03
        • 2012-07-21
        相关资源
        最近更新 更多