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

Spring integration: sftp-inbound-adapter with retry

我实现了一个 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>

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

开箱即用的 SimpleActiveIdleMessageSourceAdvice 在有消息 Vs 时使用不同的固定延迟(通过 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 触发器。