我有一个编排流程,调用子流来编写文件,然后下一个流程(通过流程参考)到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>
问题是
在写入文件时,流程在文件出站端点之后执行记录器并且已经写入文件,并且一段时间后文件连接器吐出&#34;将文件写入...&# 34 ;.如何让记录器等待文件写完?
上面的flow sftp中的文件入站端点是立即执行的,文件尚未就绪。所以它抛出一个异常,首先说它期望一个InputStream或byte []或String但得到一个ArrayList(它是业务流程的原始有效负载)。打印完这个异常后,最后文件准备就绪,入站文件连接器启动后会读取它并将其打开。这似乎与上面的问题有关,我需要以某种方式使流的其余部分等待文件写入完成。
注意:我必须创建sftp流作为流而不是子流,因为它需要是一个源。我想如果我不创建它并且没有文件连接器作为源,它将成为出站连接器。
任何帮助表示感谢。
答案 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/