Spring与RedisLockRegistry集成示例

时间:2017-02-17 11:14:16

标签: spring-integration spring-integration-sftp

我们正在实现一个流程,其中<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>

1 个答案:

答案 0 :(得分:0)

没有;您需要使用SftpPersistentAcceptOnceFileListFilterdocs 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文件,另一个用于GET单个文件;但是,您的应用必须使用元数据存储本身来确定可以获取哪些文件。