2017-06-18 45 views
0

我有一个石英计划流程,只能在初始流程完成后运行。初始流程设置数据,这些数据必须存在于石英计划过程才能成功的文件中。然而,石英过程开始,最初的过程从不开始。我只想要初始运行一次,所以我不希望它在石英流中运行。骡 - 如何安排一个应该只在Quartz计划流程前运行一次的流程

 <!-- Needs to run only once --> 
     <flow name="InitialJob"> 
     <component .... 
    </flow> 

    <!-- Depends on InitialJob --> 
    <flow name="ScheduledProcess"> 
      <quartz:inbound-endpoint responseTimeout="10000" doc:name="Schd" 
      cronExpression="0 */5 * * * ?" jobName="doIt" 
      repeatInterval="0"> 
      <quartz:event-generator-job/> 
     </quartz:inbound-endpoint> 

     <!-- I don't want to put InitialJob here, 
      I only want it to run once 
       --> 
     <flow-ref name="PerformJob"/> 
    </flow> 

有没有办法做到这一点?我如何安排流量来实现我的目标?

+0

我回答了这个问题,但是您能否对设置的数据给出更高的精度? 看起来您的应用程序将尝试在启动时自行进行自我配置。即使你所描述的问题可以解决,也可能有其他方式来处理你的“在某些文件中的设置数据”问题;) –

回答

0

您可以创建两个流程,一个将定期触发,但在启动时被禁用,一个将设置您的数据并激活周期性流程。例如:

<!-- Will run periodically once started --> 
    <flow name="PeriodicJob" initialState="stopped"> 
     <quartz:inbound-endpoint jobName="PeriodicJob" cronExpression="* * * * * ?" repeatInterval="0" responseTimeout="10000" doc:name="Quartz"> 
      <quartz:event-generator-job/> 
     </quartz:inbound-endpoint> 
     <flow-ref name="PerformJob"/> 
    </flow> 

    <!-- Will run once on start-up and activate PeriodJob --> 
    <flow name="InitialJobRunOnce"> 
     <quartz:inbound-endpoint jobName="InitialJobRunOnce" repeatInterval="0" repeatCount="0" startDelay="0" responseTimeout="10000" doc:name="Quartz"> 
      <quartz:event-generator-job/> 
     </quartz:inbound-endpoint> 
     <expression-component doc:name="Activate period job"><![CDATA[app.registry.PeriodicJob.start();]]></expression-component> 
    </flow> 

您的初始流程将在启动时运行一次,但此“运行一次流程”方法有一些限制。如果您的应用程序重新启动,初始流程将再次运行 - 尽管通过向初始流程添加一些逻辑可以以某种方式缓解这种情况。

+0

谢谢你的回应。这是我在Mule网站上找到一篇文章的完美解决方案后所做的工作! – BreenDeen

0
In your initial flow try to start the quartz flow like this`<expression-component> 
    app.registry.yourflowName.start(); 
    </expression-component>` 

Then in after quartz flow is finished try to stop the initial flow with below script:`<expression-component> 
    app.registry.yourflowName.stop(); 
    </expression-component>` 

谢谢!

+0

非常感谢,会尝试。 – BreenDeen

+0

你怎么知道初始流程何时完成?另外,一旦石英流动开始并且初始流动停止一次,这也意味着一旦石英调度器周期完成,每次都试图停止流动。这与在调度程序中运行初始作业相似 – BreenDeen

+0

如果条件满足,可以将其包装起来。 –