【问题标题】:Spring Integration with RedisLockRegistry exampleSpring 与 RedisLockRegistry 的集成示例
【发布时间】:2017-02-17 11:14:16
【问题描述】:

我们正在实现一个流程,其中<int-sftp:inbound-streaming-channel-adapter/> 轮询目录中的文件,并在找到时将流传递给服务激活器。

问题是我们将运行应用程序的多个实例,我们希望锁定进程,以便只有一个实例可以获取文件。

查看文档,Redis Lock Registry 看起来是解决方案,有没有在 xml 中使用的示例?

我能找到的只是一些对它的引用和它的源代码。

http://docs.spring.io/spring-integration/reference/html/redis.html 点 24.1

添加信息: 我添加了 RedisMetaDataStore 和 SftpSimplePatternFileListFilter。它确实有效,但确实有一个奇怪之处,当轮询器激活 sftpInboundAdapter 时,它会为元数据存储中的每个文件添加一个条目。假设有 10 个文件,数据存储中将有 10 个条目,但它不会处理“1 go”中的所有 10 个文件,每次轮询适配器只处理 1 个文件,这很好,但在多实例中环境 如果拾取文件的服务器在处理 5 个文件后停机,除非文件被“触摸”,否则另一台服务器似乎不会拾取剩余的 5 个文件。

每次轮询获取 1 个文件的行为是否正确,还是应该在一次轮询期间处理所有有效文件。

下面是我的 XML

   <int:channel id="sftpInbound"/> <!--  To Java -->
<int:channel id="sftpOutbound"/>
<int:channel id="sftpStreamTransformer"/>

<int-sftp:inbound-streaming-channel-adapter id="sftpInboundAdapter"
        channel="sftpInbound"
        session-factory="sftpSessionFactory"
        filter="compositeFilter"
        remote-file-separator="/"
        remote-directory="${sftp.directory}">
    <int:poller cron="${sftp.cron}"/>
</int-sftp:inbound-streaming-channel-adapter>

<int:stream-transformer input-channel="sftpStreamTransformer" output-channel="sftpOutbound"/>

<bean id="compositeFilter"
    class="org.springframework.integration.file.filters.CompositeFileListFilter">
    <constructor-arg>
        <list>
            <bean
                class="org.springframework.integration.sftp.filters.SftpSimplePatternFileListFilter">
                <constructor-arg value="Receipt*.txt" />
            </bean>
            <bean id="SftpPersistentAcceptOnceFileListFilter" class="org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter">
                <constructor-arg ref="metadataStore" />                 
                <constructor-arg value="ReceiptLock_" />                    
            </bean>
        </list>
    </constructor-arg>
</bean>

<bean id="redisConnectionFactory"
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="port" value="${redis.port}" />
    <property name="password" value="${redis.password}" />
    <property name="hostName" value="${redis.host}" />
</bean>

【问题讨论】:

    标签: spring-integration spring-integration-sftp


    【解决方案1】:

    没有;您需要将 SftpPersistentAcceptOnceFileListFilter (docs here) 与 Redis(或其他)元数据存储一起使用,而不是锁定注册表。

    编辑

    关于您在下面的评论。

    是的,这是一个已知问题;在 next release 中,我们添加了 max-fetch-size 正是出于这个原因 - 因此实例可以各自检索一些文件,而不是第一个实例获取所有文件。

    (入站适配器的工作原理是首先将找到的、尚未在存储中的文件复制到本地磁盘,然后一次发出一个)。

    5.0 目前仅作为里程碑提供M2 at the time of writing, but the current version and milestone repo can be found here;再过几个月就不会发布了。

    另一种选择是使用出站网关 - 一个用于 LS 文件,一个用于获取单个文件;但是,您的应用必须使用元数据存储本身来确定可以获取哪些文件。

    【讨论】:

    • 谢谢加里,我已经按照你的建议实施了,我认为它几乎就在那里,我在解释问题的原始问题中添加了额外的信息。
    • 我刚刚解决了我将 max-messages-per-poll 属性添加到 poller 并将其设置为 10,工作正常。谢谢。
    • 对;对不起,我也应该提到这一点;但在 5.0 中,您可以在实例之间进行更公平的分配。
    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多