如何在写入文件后在mule流中使用sftp?

时间:2015-07-22 14:55:56

标签: java mule sftp

我有一个编排流程,调用子流来编写文件,然后下一个流程(通过流程参考)到sftp它。

WriteSubflow

 <file:outbound-endpoint path="${outputDir}" outputPattern="${fileName}" responseTimeout="10000" doc:name="Write file"/>

 <logger message="File ${fileName}  written to ${outputDir}" level="INFO" doc:name="End"/>

然后我调用一个流程(通过ref)来启动sftp进程。

<flow name="sftp">
    <file:inbound-endpoint path="${outputDir}" connector-ref="File" responseTimeout="10000" doc:name="File">
        <file:filename-regex-filter pattern="${fileName}" caseSensitive="true"/>
    </file:inbound-endpoint>
    <sftp:outbound-endpoint exchange-pattern="one-way" connector-ref="SFTP"  responseTimeout="10000" ref="endpoint" doc:name="SFTP"  />
</flow>

问题是

  1. 在写入文件时,流程在文件出站端点之后执行记录器并且已经写入文件,并且一段时间后文件连接器吐出&#34;将文件写入...&# 34 ;.如何让记录器等待文件写完?

  2. 上面的flow sftp中的文件入站端点是立即执行的,文件尚未就绪。所以它抛出一个异常,首先说它期望一个InputStream或byte []或String但得到一个ArrayList(它是业务流程的原始有效负载)。打印完这个异常后,最后文件准备就绪,入站文件连接器启动后会读取它并将其打开。这似乎与上面的问题有关,我需要以某种方式使流的其余部分等待文件写入完成。

  3. 注意:我必须创建sftp流作为流而不是子流,因为它需要是一个源。我想如果我不创建它并且没有文件连接器作为源,它将成为出站连接器。

    任何帮助表示感谢。

2 个答案:

答案 0 :(得分:2)

所以我终于明白了,不知怎的,这两个问题都在这里的一篇博文中得到了解答 http://www.sixtree.com.au/articles/2015/advanced-file-handling-in-mule/

#1的关键是

 <file:connector name="synchronous-file-connector" doc:name="File">
     <dispatcher-threading-profile doThreading="false"/>
</file:connector>

对于Ryan上面提到的#2,使用mule requester模块。

答案 1 :(得分:1)

1)将Flow的procesingStrategy设置为synchronous

<flow name="testFlow" processingStrategy="synchronous">
        <poll frequency="10000">
            <set-payload value="some test text" />
        </poll>

        <file:outbound-endpoint path="/Users/ryancarter/Downloads"
            outputPattern="test.txt" />

        <logger level="ERROR" message="After file..." />
</flow>

2)不确定我完全理解,但你无法通过flow-ref调用入站端点,因此入站端点将被忽略,入站端点将自行运行,无论调用流如何。如果你想在mid-flow中读入文件,那么使用mule-requestor模块:http://blogs.mulesoft.com/introducing-the-mule-requester-module/