重试SFTP权限错误

时间:2016-05-10 11:01:30

标签: spring-integration spring-integration-sftp

我正在维护一个现有的Spring Integration应用程序,该应用程序正在为第三方SFTP服务器轮询文件。它偶尔会被许可或者没有找到'错误,我怀疑是由远端的瞬态问题引起的。我希望应用程序重试这些错误,因为它可能会解决问题。 (我还要求"重试任何问题",这应该涵盖这种情况。)

e.g。

org.springframework.messaging.MessagingException: Problem occurred while synchronizing remote to local directory; nested exception is org.springframework.messaging.MessagingException: Failure occurred while copying from remote to local directory; nested exception is org.springframework.core.NestedIOException: failed to read file mypath/myfile.csv; nested exception is 3: Permission denied
at [snip]
Caused by: org.springframework.messaging.MessagingException: Failure occurred while copying from remote to local directory; nested exception is org.springframework.core.NestedIOException: failed to read file mypath/myfile.csv; nested exception is 3: Permission denied
at [snip] 
Caused by: 3: Permission denied
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2846) [snip]

经过广泛的谷歌搜索和围绕圈子,我仍然无法弄清楚如何使用Spring Integration。这是现有的配置:

<bean id="myAcceptOnceFilter" class="org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter">
    <constructor-arg index="0" ref="myLocalFileStore"/>
    <constructor-arg index="1" name="prefix" value="myprefix_"/>
    <property name="flushOnUpdate" value="true"/>
</bean>

<bean id="myCompositeFilter" class="org.springframework.integration.file.filters.CompositeFileListFilter">
    <constructor-arg>
        <list>
            <bean class="org.springframework.integration.sftp.filters.SftpSimplePatternFileListFilter">
                <constructor-arg value="myprefix" />
            </bean>
            <ref bean="myAcceptOnceFilter"/>
        </list>
    </constructor-arg>
</bean>

<int-sftp:inbound-channel-adapter id="myInboundChannel"
            session-factory="mySftpSessionFactory"
            channel="myDownstreamChannel"
            remote-directory="blah"
            filter="myCompositeFilter"
            local-directory="blah"
            auto-create-local-directory="true"
            >
    <int:poller fixed-rate="10000" max-messages-per-poll="-1">
        <int:transactional transaction-manager="transactionManager" synchronization-factory="syncFactory" />
    </int:poller>
</int-sftp:inbound-channel-adapter>

编辑:我认为问题在于myCompositeFilter。当抛出异常时,看起来不会在myAcceptOnceFilter中调用rollback()。如果我只是在没有复合的情况下使用myAcceptOnceFilter,则代码按预期工作(即调用rollback())。问题是:如何继续使用对其所有子项调用回滚的CompositeFilter?

我已经考虑在轮询器中放置一个重试适配器(编辑:我现在知道这是无关紧要的):

<bean id="retryAdvice" class="org.springframework.integration.handler.advice.RequestHandlerRetryAdvice"/>

<int:poller fixed-rate="10000" max-messages-per-poll="-1">
    <int:advice-chain>
        <tx:advice transaction-manager="transactionManager"/>
        <int:ref bean="retryAdvice"/>
    </int:advice-chain>
</int:poller>

...但是会发出警告

This advice org.springframework.integration.handler.advice.RequestHandlerRetryAdvice can only be used for MessageHandlers

简而言之,我被困住了。非常感激地收到关于让它重试这种sftp异常的任何帮助。谢谢!

编辑:在提到SftpPersistentAcceptOnceFileListFilter时添加。 编辑:添加了对CompositeFileLIstFilter的讨论,现在看起来就像问题的位置。

1 个答案:

答案 0 :(得分:1)

重试建议用于使用端点(推送重试)。

目前还不清楚为什么你需要在这里添加重试 - 轮询器将在下次轮询时固有地重试。