2011-08-09 106 views
2

簡短版本:如何讓JBPM5規則節點使用讀取和更新流程變量的DRL文件?從JBPM 5中的規則任務訪問流程實例

長版本: 我有一個流程定義,在JBPM5下運行。這個過程的開始看起來是這樣的:

[開始] - > [規則節點] - > [網關(矛盾時)] ...等

網關對一個變量使用約束命名爲「isValid」。

我的規則節點指向RuleFlowGroup「驗證」,其中只包含一個規則:

rule "Example validation rule" 
    ruleflow-group "validate" 

    when 
     processInstance : WorkflowProcessInstance() 
    then 
     processInstance.setVariable("isValid", new Boolean(false)); 
end 

所以,我的邏輯,如果這是得到正確處理,那麼網關應該始終遵循「假」路徑。

在我的Java代碼,我有類似如下:

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
kbuilder.add(ResourceFactory.newClassPathResource("myProcess.bpmn"), ResourceType.BPMN2); 
kbuilder.add(ResourceFactory.newClassPathResource("myRules.drl"), ResourceType.DRL); 

KnowledgeBase   kbase = kbuilder.newKnowledgeBase(); 
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 

new Thread(new Runnable() 
    { 
     public void run() 
     { 
     ksession.fireUntilHalt(); 
     } 
    }).start(); 

// start a new process instance 
Map<String, Object> params = new HashMap<String, Object>(); 
params.put("isValid", true); 
ksession.startProcess("test.processesdefinition.myProcess", params); 

我可以確認以下內容:

  • 的DRL文件是越來越加載到工作記憶,因爲當我把語法文件中的錯誤,然後我得到錯誤。
  • 如果我在Java params映射中包含「isValid」的值,那麼該進程只會遵循Java指定的路徑,顯然會忽略drools規則。
  • 如果我從參數映射中取出「isValid」參數,則會出現運行時錯誤。

由此我假定規則中的最後一個「setVariable」行不是正在執行,就是正在更新錯誤的東西。

我想我的問題是有關官方文檔在此聲明:

規則約束不必過程中定義的變量直接訪問。然而,通過將 流程實例添加到工作內存並匹配您的 規則約束中的流程實例,它是 但是可以引用規則約束內的當前流程實例。我們添加了特殊邏輯,以確保類型爲WorkflowProcessInstance的變量processInstance只會與當前流程實例相匹配,而不會與其他 工作內存中的其他 流程實例相匹配。請注意,您自己負責 將流程實例插入會話中,並且可能需要對其進行更新,例如,使用Java 代碼或進程中的入門或退出或顯式操作。

但我無法弄清楚如何做到這裏描述的。如何將流程實例添加到工作內存中,使其可以訪問此第一個Rule Node?規則節點似乎不支持進入行爲,並且我無法將其添加到Java代碼中,因爲該進程可以非常輕鬆地完成規則節點的執行,然後工作內存已更新爲包括該進程。

回答

2

正如你提到的,有幾個選項來插入流程實例到工作內存: - 調用startProcess() 後,將其插入 - 使用動作腳本,將它(使用「插入(kcontext.getProcessInstance() 「)

如果調用startProcess()可能已經超出了規則任務(在您的示例中可能是這種情況),並且您的規則任務前面沒有另一個節點,您可以只使用進入/退出腳本來做到這一點(所以這是隱藏的),我會建議你的規則任務之前使用明確的腳本任務來做到這一點。

Kr是

+0

感謝克里斯,添加一個腳本任務明確這樣做已經解決了這個問題。有沒有理由說明進程不會自動將自身添加到進入規則節點的工作內存中?看起來對於無法訪問其過程變量的規則節點沒有什麼好處,並且將這些指令添加到過程中會將執行環境與實際的業務意圖混合在一起,這似乎很麻煩...... – Erica