2012-03-26 51 views
1
<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被觸發之前執行。如何在Quartz Scheduler配置時從主流調用私有流執行?

如何實現流程,以便始終從Flow1調用Flow2?

回答

0

如果您在flow1中使用flow-ref,那麼使您的flow2成爲子流。然後從流程2中刪除jms入站端點

<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與你的例子一樣。

+0

在這種情況下,Q2將包含消息有效載荷200,這是一種會污染我的商業消息隊列的垃圾消息-Q2。 – Udhay 2012-03-29 14:39:56

+0

我想以更歪曲的方式實現所有這一切..........應該將隊列Q1消息出隊並傳遞給具有webservice調用目標的組件。如果這些服務不可用,我會丟失Q1到DLQ的消息。 – Udhay 2012-03-29 14:42:19

+0

好的,我看到你在嘗試。我猜想,入站隊列嘗試立即輪詢隊列時,隊列不會執行這個技巧嗎?你可以將對象保存到會話屬性列表中,以使其工作嗎? – hequ 2012-03-29 18:39:08

0

其實Flow2不是私人的。要使其變爲私密,您必須刪除入站端點。

沒有采取這種方法,流量將無法從流量Ref元素調用。

雖這麼說,你可以使用3辦法(建議在騾子3.2,目前推出)

  1. 子流:它會表現爲一個子程序共享例外調用流程(如異常策略的背景和線程池)
  2. 私有流(對於mule 3.1.x):它將創建一個新的流,其自身的上下文將處理由調用流生成的消息
  3. 將消息發佈到隊列(例如jms Q2或一個Vm之一)並從您當前的流量消耗它
0

您可以申報中級課程前的初始狀態爲「已停止」:

這將防止中級課程初級流瑜伽之前運行(或者在所有運行)。

然後你就可以通過編程用Groovy腳本啓動它:

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

一旦你開始它的JMS隊列將開始投票。

我希望這會有所幫助。