如何使用Quartz组件安排服务,该组件将定期调用文件上传器?

时间:2013-01-23 11:17:12

标签: mule mule-studio

这是我之前提问How to upload multiple files via REST over HTTP using Mule?的扩展。要求说,在每个星期三上午10点,必须上传文件。从此以后我需要一个调度程序来完成这个任务。我发现解决方案是带有Cron Expression的“Quartz”入站组件。

但我怎么能这样做?因为我不能有两个“入站端点”。(石英和文件),例如。

<flow name="fileUploader" doc:name="fileUploader">

    <quartz:inbound-endpoint 
        jobName="myServiceJob" 
        repeatInterval="5000" 
        cronExpression="0 0 10 ? * WED 
        doc:name="Quartz">
        <quartz:event-generator-job/>
   </quartz:inbound-endpoint>

        <file:inbound-endpoint 
            path="C:\input"
            pollingFrequency="5000" moveToDirectory="C:\movehere" doc:name="File"
            responseTimeout="10000"/>

    <object-to-byte-array-transformer doc:name="Object to Byte Array"/>

    <file:outbound-endpoint 
            path="C:\outputfile" 
            responseTimeout="10000" 
            doc:name="File"/>

</flow>

如果我跑,我会收到错误

线程“main”中的异常org.mule.module.launcher.DeploymentInitException:SAXParseException:cvc-complex-type.2.4.a:找到以元素'file:inbound-endpoint'开头的无效内容。< /强>

那么我需要做的改变是什么?

请帮忙

4 个答案:

答案 0 :(得分:4)

试试这个

<file:endpoint name="fileConnector" path="C:\input" pollingFrequency="5000" doc:name="File"/>

<flow name="fileUploader" doc:name="fileUploader">

        <quartz:inbound-endpoint 
        jobName="myServiceJob" 
        repeatInterval="5000" 
        cronExpression="0 0 10 ? * WED" 
        doc:name="Quartz">

        <quartz:endpoint-polling-job>
            <quartz:job-endpoint ref="fileConnector"/>
        </quartz:endpoint-polling-job>
       </quartz:inbound-endpoint>

       <file:outbound-endpoint 
        path="C:\outputfile" 
        responseTimeout="10000"        
            outputPattern="#[message.inboundProperties.originalFilename]"       
       doc:name="File"/>
</flow>

答案 1 :(得分:1)

您有两种选择:

一个。使用处理文件处理的组件替换文件入站端点。它将由Quartz触发,从文件夹中获取文件并将其传递给出站端点。

湾不要使用Quartz端点并覆盖org.mule.transport.file.FileMessageReceiver来实现轮询文件的自定义计划。

第一种选择是更容易的选择。

答案 2 :(得分:0)

以下只是一轮工作,如果你找不到你需要的确切内容。

1-您可以有2个流而不是1个,一个用普通入站进行正常工作,一个用于石英:入站端点。

2-您可以让您的调度程序将消息放入队列,并有另一个流来从该队列和进程中获取消息。

3-你可以在这里建议使用quartz:inbound-endpoint的组件http://blogs.mulesoft.org/using-quartz-to-trigger-a-service/

希望以上其中一项有所帮助。

答案 3 :(得分:0)

很抱歉无法将此作为评论,因为它太长了所以这里是来自Mule网站<quartz:endpoint-polling-job>的示例:

<service name="testService5">
  <description>
  The endpoint polling Job will try and perform a 'request' on any Mule endpoint. If a result is received it will be handed off to this 'testService5' service for processing. The trigger will fire every 5 minutes starting at 2pm and ending at 2:55pm, every day. during this period the job will check the file directory /N/drop-data/in every 5 minutes to see if any event data is available. The request will timeout after 4 seconds if there are no files in the directory. 
  </description>

  <inbound>
    <quartz:inbound-endpoint name="qEP5" cronExpression="0 0/5 14 * * ?" jobName="job5"
           connector-ref="quartzConnector1">
      <quartz:endpoint-polling-job>
        <quartz:job-endpoint address="file:///N/drop-data/in" timeout="4000"/>
      </quartz:endpoint-polling-job>
    </quartz:inbound-endpoint>
  </inbound>
</service>

希望以上帮助