2015-05-21 29 views
0

我在我的應用程序中使用Drools 6.1.0。需要實現Drools規則的設計指導

我們正計劃編寫一個包含所有規則的巨大.drl文件。

將有主要兩類規則 1. null檢查 2.業務驗證

使用規則流組,激活組,凸顯我打算管理哪些規則執行/火時,事實被添加到會話中。

即使採用這種方法,解決方案也不適合我,因爲。

可以說我有以下.drl文件

rule "rule1" 
ruleflow-group "primary" 
activation-group "NullCheck" 
salience 5 
when 
    $m : Message(innerMsg.something == null) 
then 
    // do something 

rule "rule2" 
ruleflow-group "primary" 
activation-group "NullCheck" 
salience 4 
when 
    $m : Message(innerMsg.something.something == null) 
then 
    // do something 

rule "rule3" 
ruleflow-group "primary" 
activation-group "NullCheck" 
salience 3 
when 
    $m : Message(innerMsg.something.something.something == null) 
then 
    // do something 

Drools的文件說,這「當事實被插入的所有約束評估從Drools的手冊:條件評估不依賴於具體的評價序列或時間點,但是它在發動機的使用壽命期間的任何時間連續發生。「

所以發生的是,這是執行此文件中的代碼是在規則2拋出空指針異常,因爲innerMsg.something.something是NULL

注:我不想使用俱樂部所有的null檢查||在一個單一的時候聲明,因爲我想捕獲特定的空條件並基於它創建錯誤消息。

我的問題如下。

  1. 是否使用drools規則爲鏈接對象執行Nullchecks是一個好主意。
  2. 我是否應該使用其他類似順序規則執行(不確定在Drools中是否可用),這將允許我按特定順序執行規則。
  3. 有另一種方式來實現這一

回答

0

你無法避免的是使你的代碼無效。

要麼你前綴的每一個條件訪問字段對象與空測試亞型:

Fact(field != null && field.subfield == whatsoever) 

,或者你使用空安全的對其操作:

Fact(field!.subfield == whatsoever) 

注意==!=隱含無效,因此您可以編寫

Fact(field == whatever) 

沒有問題,如果field == null

放棄使用激活組和突出顯示來儘快實現流量控制的想法。它會導致一個非常糟糕的規則設計,不可維護的代碼和普遍的不快樂。如果不能,請用Java或其他語言編寫。

+0

那麼建議不要使用議程組/ runflow-group等? –

+0

有些情況下,議程組和突出顯示,但AFAIK我不認爲這些可以在您的應用程序中找到。 – laune

0

我想http://drools-moved.46999.n3.nabble.com/rules-users-Drools-Activation-Group-td3546598.html可能是相關的,你看到的。你可以嘗試下面的東西。

rule "rule2" ruleflow-group "primary" activation-group "NullCheck" salience 4 when $m : Message(innerMsg != null) Message(this == $m, innerMsg.something != null) Message(this == $m, innerMsg.something.something == null) then

這個工作對你的願望,避免了一堆||在一定程度上,但它是一種不同的語法。

+0

絕對沒有理由不把這一切全部放在一個單一的模式,使用&&'結合所有的約束。我對這個Nabble問題的回答已經過時,因爲同時在Drools中增加了無效安全性。 – laune