【问题标题】:How to rectify the issue with the below flow?如何通过以下流程纠正问题?
【发布时间】:2013-01-31 14:22:59
【问题描述】:

我有一个骡子流

<flow name="flow1" doc:name="f1">
    <file:inbound-endpoint path="C:\input" responseTimeout="10000"
        doc:name="File" />
</flow>

<flow name="flow2" doc:name="f2">
    <http:inbound-endpoint address="http://localhost:8080"
        doc:name="HTTP" exchange-pattern="request-response" />
    <flow-ref name="flow1" doc:name="Flow Reference" />
    <file:outbound-endpoint path="C:\outputfile"
        responseTimeout="10000" doc:name="File" />
</flow>

我正在尝试使用流程将多个文件从源移动/上传到目标(可以是任何东西,例如 FTP 或文件出站等)。

这样做的原因是我想使用 CURL 从 CLI(命令行界面)调用作业。

但它不起作用....

已编辑

我需要从位于我的硬盘驱动器中的特定文件夹中提取一些文件(多个文件)。然后将它们移动到一些出站进程,可以是 FTP 站点或其他硬盘驱动器位置。 但是这个流程需要从 CLI 中调用。

已编辑(基于大卫的回答)

我现在有如下流程

<flow name="filePickupFlow" doc:name="flow1" initialState="stopped">
     <file:inbound-endpoint path="C:\Input" responseTimeout="10000" doc:name="File"/>
            
      <logger message="#[message.payloadAs(java.lang.String)]" level="ERROR" />
</flow>

<flow name="flow2" doc:name="flow2">
  <http:inbound-endpoint address="http://localhost:8080/file-pickup/start" doc:name="HTTP" exchange-pattern="request-response"/>
  
  <expression-component>
        app.registry.filePickupFlow.start();
    </expression-component>
 
 <file:outbound-endpoint path="C:\outputfile" responseTimeout="10000" doc:name="File"/>

</flow>

我遇到了几个问题

a) 我收到一个错误 - 属性 initialState 未定义为流的有效属性

但是,如果我删除该属性,流程将继续,而无需等待 "http://localhost:8080/file-pickup/start" 启动。

b) 文件未移动到目标文件夹

那我该怎么做呢?

【问题讨论】:

  • 您想在文件可用时读取文件还是仅在基于调用或事件触发读取时读取文件?

标签: mule mule-studio


【解决方案1】:

您无法引用其中包含入站端点的流,因为此类流已经处于活动状态并正在使用来自其入站端点的事件,因此您无法按需调用它。

以下内容在 Mule 3.3.1 上进行了测试,展示了如何根据 HTTP 请求启动“文件提取流程”。

<flow name="filePickupFlow" initialState="stopped">
    <file:inbound-endpoint path="///tmp/mule/input" />
    <!-- Do something with the file: here we just log its content -->
    <logger message="#[message.payloadAs(java.lang.String)]" level="ERROR" />
</flow>

<flow name="filePickupStarterFlow">
    <http:inbound-endpoint address="http://localhost:8080/file-pickup/start"
        exchange-pattern="request-response" />
    <expression-component>
        app.registry.filePickupFlow.start();
    </expression-component>
    <set-payload value="File Pickup successfully started" />
</flow>

HTTP GETting http://localhost:8080/file-pickup/start 然后会启动 filePickupFlow,然后会处理 /tmp/mule/input 中的文件。

请注意,您可以为 file:connector 配置它所处理的文件必须具有的行为,删除它们或将它们移动到另一个目录是两个主要选项。

【讨论】:

  • 我已添加要求。调用 Http 端点时,需要从特定位置提取文件并移动到某个出站进程(可能是 FTP 或其他硬盘驱动器位置)。如果我需要提供任何其他信息,请告诉我
  • 谢谢,我已经相应地审查了我的答案。
  • 先生,还有一件事情。该过程应该拾取文件夹内的所有文件(多个文件),而不是任何特定的文件。即它应该从 /tmp/input 中选择所有文件,而不仅仅是 /tmp/input/debuglog.txt ......那么我应该如何更改它?
  • 哇,那是完全不同的要求!提取文件的目录是固定的还是 HTTP 调用传递的?
  • 它是一个固定目录,不是从 Http 调用传递过来的....说初始目录是 C:\MyInput
【解决方案2】:

我猜在这种情况下,按需读取文件的文件入站将没有帮助。

请尝试以下方式。

<flow name="flow1" doc:name="f2">
    <http:inbound-endpoint address="http://localhost:8080"
        doc:name="HTTP" exchange-pattern="request-response" />
    <component>
        <spring-object bean="fileLoader"></spring-object>
    </component>
   <file:outbound-endpoint path="C:\outputfile"
       responseTimeout="10000" doc:name="File" />
</flow>

所以自定义组件将是一个从您指定位置读取文件的类。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    您可以使用 Mule Requester 获得干净的解决方案。详见博文Introducing the Mule Requester

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-27
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多