2009-10-02 34 views
0

我創建了兩個「Hello World」進程來爲子進程節點提供旋轉。我無法將子流程的輸出返回到主流程。我希望有人能夠指導我做錯了什麼,因爲我找不到任何文檔或示例說明我爲什麼不工作。Drools SubProcess出映射失敗 - 我做錯了什麼?

在我的主要過程中,我有以下的(請注意,我剪斷頁眉,頁腳和位置的x,y,高度,寬度屬性):

 
... snip... 

<header> 
    <variables> 
    <variable name="name" > 
     <type name="org.drools.process.core.datatype.impl.type.StringDataType" /> 
     <value>World</value> 
    </variable> 
    <variable name="length" > 
     <type name="org.drools.process.core.datatype.impl.type.IntegerDataType" /> 
     <value>0</value> 
    </variable> 
    </variables> 
</header> 

... snip... 

<subProcess id="4" name="SubHello" 
      processId="subhello" waitForCompletion="true" > 
<mapping type="in" from="name" to="name" /> 
<mapping type="out" from="length" to="length" /> 
</subProcess> 

... snip... 

這裏是簡單subhello子流程,它只是接受輸入並打印出來,然後獲取輸入長度返回它回來了:

 
... snip... 

<header> 
    <variables> 
    <variable name="name" > 
     <type name="org.drools.process.core.datatype.impl.type.StringDataType" /> 
     <value></value> 
    </variable> 
    <variable name="length" > 
     <type name="org.drools.process.core.datatype.impl.type.IntegerDataType" /> 
     <value></value> 
    </variable> 
    </variables> 
</header> 

<nodes> 
    <start id="1" name="Start" /> 
    <end id="2" name="End" /> 
    <actionNode id="3" name="Action" > 
     <action type="expression" dialect="mvel" > 
System.out.println(name + ", " + length + ", in SubProcess, before"); 
length = name.length; 
System.out.println(length + ", in SubProcess, after"); 
     </action> 
    </actionNode> 
</nodes> 

... snip... 

這是按我如何解釋的文檔和示例。所需的變量在主進程和子進程中聲明,然後使用subProcess進/出映射元素來設置from和to屬性。

問題是....而name傳入子進程沒有問題,試圖讓length回到主進程失敗。 subProcess中的length已成功修改。但在退出時,length在主流程中沒有變化。

我在做什麼錯?指針和解釋非常感謝。謝謝。

回答

2

問題是您的操作不會更改長度變量。它僅僅改變你的動作中的局部變量長度。要更改變量的值,請使用kcontext.setVariable(「length」,name.length());

您還應該更新到最新的Drools 5.1 M1版本,因爲這包括在子進程完全同步(如您的示例中的情況)時出現映射問題的修復程序。

Kris Verlaenen

+0

感謝您的修復。我只想指出,文檔需要更清楚一點,我實際上必須在Action節點中調用context.setVariable(),才能設置流程變量的值。 Action節點doc沒有提及在length = name.length中設置一個局部變量。從SubFlow文檔中,我只是假定配置長度=長度就足夠了。但再次感謝!我正在研究事件處理。 – aberrant80 2009-10-05 03:29:44