Spring集成:带重试的sftp-inbound-adapter

时间:2015-12-14 16:52:34

标签: spring-integration

我实现了一个sftp-inbound-adapter,应该每天下午2点启动,如果结果为空(没有收到文件),我希望在2小时后只进行一次重试,

如何使用重试机制执行此操作? 我的源代码如下:

<int-sftp:inbound-channel-adapter id="sftpInbondAdapter"
    auto-startup="true" channel="receiveChannel" session-factory="sftpSessionFactory"
    local-directory="file:local-dir" remote-directory="/"
    auto-create-local-directory="true" delete-remote-files="false"
    filename-regex=".*\.txt$">

    <int:poller cron="0 0 14 * * ?"></int:poller>

    <int-sftp:request-handler-advice-chain>
        <ref bean="retryAdvice" />
    </int-sftp:request-handler-advice-chain>

</int-sftp:inbound-channel-adapter>

1 个答案:

答案 0 :(得分:0)

从4.2开始,您可以使用Smart Poller根据是否有消息来调整轮询频率。

开箱即用,当有消息V时,SimpleActiveIdleMessageSourceAdvice使用不同的固定延迟(通过DynamicPeriodicTrigger)。没有消息。

如果您不喜欢它的算法(它使用延迟,而不是cron表达式),您可以编写AbstractMessageSourceAdvice的自定义子类。

我不确定你的retryAdvice bean是什么,但重试通常只适用于有异常的情况。

修改

我已经创建了一个更适合您的新建议;见the gist here

您可以像这样配置它......

...
    <int:poller trigger="compoundTrigger">
        <int:advice-chain>
            <bean class="example.CompoundTriggerAdvice">
                <constructor-arg ref="compoundTrigger"/>
                <constructor-arg ref="secondary"/>
            </bean>
        </int:advice-chain>
    </int:poller>
...

<bean id="compoundTrigger" class="example.CompoundTrigger">
    <constructor-arg ref="primary" />
</bean>

<bean id="primary" class="org.springframework.scheduling.support.CronTrigger">
    <constructor-arg value="0 0 14 * * ?" />
</bean>

<bean id="secondary" class="org.springframework.scheduling.support.PeriodicTrigger">
    <constructor-arg value="7200000" />
</bean>

当没有收到任何消息时,我们将使用辅助触发器(2小时),否则使用cron触发器。