在配置Quartz调度程序时如何从主流调用私有流执行?

时间:2012-03-26 06:30:40

标签: mule

<flow name="Flow1">
   <quartz:inbound-endpoint jobName="ReadQ1" cronExpression="* 30 15 * * ?">
     <quartz:endpoint-polling-job>
     <quartz:job-endpoint address="jms://Q1"/>
     </quartz:endpoint-polling-job>
   </quartz:inbound-endpoint>
   <component>
     <singleton-object class="MyComponenet"/>
   </component>
   <choice>
      <when expression="payload==200" evaluator="groovy">
         <flow-ref name="Flow2"/>
      </when>
   </choice>
</flow>
<flow name="Flow2">
  <jms:inbound-endpoint queue="Q2"/>
  <component class="AnotherComponent"/>
  <jms:outbound-endpoint queue="Q3"/>
</flow>

我希望Flow1能够按照定义的石英计划(15:30)执行。 并且基于MyComponent的有效负载返回,我引用Flow2来执行。 但Flow2在触发Flow1之前执行。

如何实现流程以便始终从Flow1调用Flow2?

3 个答案:

答案 0 :(得分:0)

如果在flow1中使用flow-ref,则将flow2设为子流。然后从flow2

中删除jms-inbound端点
<sub-flow name="Flow2">
  <component class="AnotherComponent"/>
  <jms:outbound-endpoint queue="Q3"/>
</sub-flow>

如果你想使用flow-ref,还要用子流替换flow3。

另一个选择是用<jms:outbound-endpoint queue="Q2"/>替换你的flow-ref调用,并保持你的flow2在你的例子中。

答案 1 :(得分:0)

实际上Flow2不是私有的。要将其设为私有,您必须删除入站端点。

如果不采用这种方法,流量将无法从flow-ref元素中调用。

据说你可以使用3种方法

  1. 子流程(在mule 3.2中引入,目前推荐):它将作为子程序共享异常调用流程的上下文(例如异常策略和线程池)
  2. 私有流(对于mule 3.1.x):它将创建一个具有自己的上下文的新流,该流将处理由调用流生成的消息
  3. 将消息发布到队列(例如jms Q2或vm)并从当前流中消耗它

答案 2 :(得分:0)

您可以将Flow2的初始状态声明为“已停止”:

这将阻止Flow2在Flow1之前运行(或者根本不运行)。

然后,您可以使用groovy脚本以编程方式启动它:

if (muleContext.registry.lookupFlowConstruct('Flow2').isStopped())
{
    muleContext.registry.lookupFlowConstruct('Flow2').start()
}

启动它后,jms队列将开始轮询。

我希望这会有所帮助。