2

ファイルのサードパーティ SFTP サーバーをポーリングしている既存の Spring Integration アプリケーションを維持しています。パーミッションまたは 'not found' エラーがスローされることがありますが、これはリモート エンドでの一時的な問題が原因であると思われます。おそらく問題が解決するので、これらのエラーの取得をアプリケーションに再試行してもらいたいと思います。(このケースをカバーする必要がある「問題を再試行する」という要件もあります。)

例えば

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 の説明を追加しました。

4

1 に答える 1