2013-12-16 47 views
3

我有一個線程安全問題圍繞異步範圍和流量變量和flow-ref組件。騾異步範圍與流量參考和流量變量

以例如下列:

<flow> 
    <set-variable variableName="numericalValue" value="5" /> 
    <async> 
     <flow-ref name="calculate" /> 
    </async> 

    <set-variable variableName="numericalValue" value="10" /> 
    <async> 
     <flow-ref name="calculate" /> 
    </async> 
</flow> 

即時猜測流動VAR「numericalValue」可以從5第一流REF之前被改變爲10被實際處理?

是否安全做到以下幾點:

<flow> 

    <async> 
     <set-variable variableName="numericalValue" value="5" /> 
     <flow-ref name="calculate" /> 
    </async> 


    <async> 
     <set-variable variableName="numericalValue" value="10" /> 
     <flow-ref name="calculate" /> 
    </async> 
</flow> 

有人能解釋這是如何工作的?

PS。 我的計算流量是一家民營異步流:

<flow name="calculate" processingStrategy="asynchronous"> 

回答

3

兩種方法都是容易出現問題。讓我解釋一下爲什麼。

正如你可以在這裏看到:https://github.com/mulesoft/mule/blob/mule-3.x/core/src/main/java/org/mule/processor/AsyncDelegateMessageProcessor.java#L112

// Clone event and make it async 
MuleEvent newEvent = new DefaultMuleEvent(
     (MuleMessage) ((ThreadSafeAccess) event.getMessage()).newThreadCopy(), event, false); 

騾子克隆處理async塊之前的事件。所以人們可以認爲一切都很好,克隆的事件與原始事件沒有關係。

這是不幸的是沒有的情況下,因爲克隆的事件是原始事件的流程變量的支持,如下所示:https://github.com/mulesoft/mule/blob/mule-3.x/core/src/main/java/org/mule/DefaultMuleEvent.java#L328

if (rewriteEvent instanceof DefaultMuleEvent) 
{ 
    this.processingTime = ((DefaultMuleEvent) rewriteEvent).processingTime; 
    this.flowVariables = ((DefaultMuleEvent) rewriteEvent).flowVariables; 
} 

然後騾子消息被引用到這些流程變量這裏https://github.com/mulesoft/mule/blob/mule-3.x/core/src/main/java/org/mule/DefaultMuleEvent.java#L953,因此可以通過Invocation屬性範圍訪問它們。

所有這一切都導致在一個線程中更改的流變量在另一個線程中可見。

所以,如果你想完全隔離創建另一個流量變量或使用出站郵件屬性,後者被複制不交叉引用每個:https://github.com/mulesoft/mule/blob/mule-3.x/core/src/main/java/org/mule/DefaultMuleMessage.java#L222