循环通道以更新标题丰富器以将文件放置在多个目标中

时间:2018-11-12 13:10:15

标签: spring spring-mvc spring-integration spring-integration-sftp spring-integration-aws

尝试使用spring-integration-file使用单个出站网关将文件放置在多个目录中。我知道,使用这样的通道适配器无法一次发送到多个目录。

为了实现这一点,在file:outbound-gateway前面有一个循环,可以在每次迭代时修改消息头目标目录,并将它们一次又一次地发送到同一通道。

但是遇到异常,如下所述。

关于如何循环播放或更新标头并再次执行适配器的任何建议

文件:出站网关:

<!-- header enricher -->
    <integration:header-enricher input-channel="filesHeaderEnricherChannel" output-channel="filesOut">
       <integration:header name="TARGET_COUNT" method="getTargetCount" ref="headerEnricher"/>
            <integration:header name="TARGET_DIR" method="getTargetPath" ref="headerEnricher"/>     
    </integration:header-enricher>

    <integration:chain id="filesOutChain" input-channel="filesOut">
        <integration:transformer expression="headers.FILE"/>
            <file:outbound-adapter id="fileMover" 
                auto-create-directory="true"
                directory-expression="headers.TARGET_DIR"
                mode="REPLACE">
                <file:request-handler-advice-chain>
                    <ref bean="retryAdvice" />
                </file:request-handler-advice-chain>
            </file:outbound-adapter>    
       </integration:chain> 

<!-- decreasing the count on each loop -->
<!-- looping to header enricher channel again as output channel to update the target directory -->
           <integration:filter input-channel="filesOut"  expression="headers.TARGET_COUNT != 0" output-channel="filesHeaderEnricherChannel"
                    discard-channel="filesArchiveChannel" throw-exception-on-rejection="true">
                    <integration:request-handler-advice-chain>
                    <ref bean="retryAdvice" />
                    </integration:request-handler-advice-chain>
        </<integration:filter>

1 个答案:

答案 0 :(得分:1)

您不需要在链的末尾有<integration:gateway request-channel="filesOutChainChannel"。您应该只配置一条链以输出到filesOutChainChannel中,然后在过滤器中看来您做对了。

网关等待答复的问题,但是由于您将其循环回到filesHeaderEnricherChannel中,因此您的呼叫栈将随着等待网关的出现而不断增长。