如何使用多个sftp出站网关

时间:2018-01-22 18:04:48

标签: java spring-integration

我是Spring Integration的新手,我正在使用两个流程:

1.-从sftp读取文件,保存信息。我使用方法" mget"。

2.-保存信息之后,使用方法" mput"重命名在sftp服务器中处理的文件。

这是我的配置:

<bean id="filePrinter" class="com.maven.integration.FilePrinter" />

<int:channel id="outboundChannel"></int:channel>

<int:channel id="aggregateResultsChannel"/>

<int:channel id="toGet"></int:channel>

<int:gateway id="simpleGateway" service-interface="com.maven.integration.FileGateway"
    default-request-channel="ftpChannel" />

<int-sftp:outbound-gateway 
    session-factory="sftpClientFactory"
    request-channel="ftpChannel" 
    command="mget" 
    command-options="-R -P"
    expression="payload" 
    filename-regex="(new|.*.csv)"
    mode="IGNORE"
    local-directory-expression="@targetDir.get() + #remoteDirectory"
    reply-channel="outboundChannel"
    >
    <int-sftp:request-handler-advice-chain>
        <int:retry-advice />
    </int-sftp:request-handler-advice-chain>
</int-sftp:outbound-gateway>

<int:splitter input-channel="outboundChannel" output-channel="toGet"/>

<bean id="targetDir" class="java.util.concurrent.atomic.AtomicReference">
    <constructor-arg value="${target}"/>
</bean>

<int:service-activator ref="filePrinter" method="print"
    input-channel="toGet"/>


    <int-sftp:outbound-gateway 
    session-factory="sftpClientFactory"
    request-channel="toGet" 
    command="mput" 
    command-options="-R"
    local-directory="src/test/"
    expression="payload" 
    filename-regex="(new|.*.csv)"
    mode="IGNORE"
    remote-filename-generator-expression="payload.getName() + '.ack'"
    remote-directory-expression="#remoteDirectory"
    reply-channel="aggregateResultsChannel"
    >
    <int-sftp:request-handler-advice-chain>
        <int:retry-advice />
    </int-sftp:request-handler-advice-chain>
</int-sftp:outbound-gateway>

<int:aggregator input-channel="aggregateResultsChannel"/>

目前只执行第一个带有mget命令的出站网关,但第二个出站网关未执行,第二个进程如何运行?

1 个答案:

答案 0 :(得分:0)

因为您的toGet是一个简单的DirectChannel,其中“每个消息订阅者只有一个”逻辑。同时,您的mput网关将request-channel="toGet"网关用作 <int:service-activator>is earlier in the config, it is a first subscriber in the共享此频道的用户。由此,and therefore only this one process the message sent to the由分割器获取mput toGet`。

我认为您需要做的事情(如果故事仍然是关于mget)与您在MGET中所拥有的完全相反。所以,你应该和分裂一起做这个逻辑,而不是之后。因此,您应该将MPUT结果发送到拆分器并同时发送到outboundChannel。为此,我建议您将<publish-subscribe-channel>更改为outboundChannel,并在mput网关中使用request-channel function f() { const { remote } = require("electron").remote; if (remote) { return remote.getGlobal("abc"); } return global.abc; }