2011-04-08 49 views
1

我們將要爲客戶實施使用Drools的規則引擎,其中一個要求是能夠說規則與特定的法律要求相關聯。是否可以將自定義屬性添加到流口水規則?

例如,法律規定,駕駛執照只能頒發給某人18歲以上,所以我們有:

rule "Driving Licence: Age >= 18" 
    when 
     $applicant: Applicant(age < 18) 
     $application: Application() 
    then 
     $application.setValid(false); 
end 

或個稅的總計算

rule "Tax: Top bracket" 
    when 
     $return: Return(income > 44000) 
    then 
     $application.setTopBracket(true); 
end 

或類似的。

一個解決方案是在名稱的法律要求:

rule "Driving Licence: Age >= 18: Section 103 RTA 1988" 

的問題是:這將是實現這一目標的最佳途徑?名字是唯一的方法嗎?有沒有辦法將自定義屬性添加到規則?如果是這樣,它可以是強制性的嗎?我也可以使用評論,但我寧願避免這種情況。

如果在規則軌跡中我們也可以看到這些屬性的軌跡,那將會很好,但這並不重要。

請注意,我不想改變規則邏輯,我只想說'這個規則來自這個規律'。規則的決定並不重要。我不希望更改setValid setter。

+0

在閱讀您的評論後,我有兩個問題:您想在哪裏使用/查看此信息以及以何種格式存儲您的規則(DRL | XML | excel文件| Guvnor)? – pgras 2011-04-08 13:32:25

+0

正如我在這個問題中所說的,我希望在編輯規則時看到這一點。在追蹤中也會很好,但並不重要。對於格式,目前沒有定義的格式,系統仍在定義中。 – 2011-04-08 13:38:50

回答

7

您可以使用規則元數據。元數據不會影響您的規則,除非您願意,您可以在LHS或RHS中使用它。您也可以在調試時訪問元數據,例如您可以使用AgendaFilter打印元數據並查看正在觸發的規則以及它們具有的法定要求。

如果你想強制每個規則的元數據,你需要爲自己編寫檢查代碼。

@metadata_key(metadata_value1, metadata_value2, ... ) 

rule "Driving Licence: Age >= 18" 
@LegalRequirement("Section 103 RTA 1988") 
when 
    $applicant: Applicant(age < 18) 
    $application: Application() 
then 
    $application.setValid(false); 
end 

這是AgendaFilter的一個例子。如果您返回錯誤,則會阻止規則開火。我只是用它來打印的法律要求:

StatefulKnowledgeSession ksession= createKSession(); 
ksession.fireAllRules(new AgendaFilter() { 
    public boolean accept(Activation activation) { 
    Map<String, Object> metaData = activation.getRule().getMetaData(); 
    if (metaData.containsKey("LegalRequirement")) { 
     System.out.println(metaData.get("LegalRequirement")); 
    } 
    return true; 
    } 
}); 

或者,如果你想用它在RHS:

rule.getMetaData().get("LegalRequirement"); 

如果您使用的Guvnor來管理你的規則,你也可以使用類別設置。對於存儲在Guvnor中的每個資產,類別是強制性的。

+0

這將如何工作,我們只需要做Rule.getMetaData()。get(「LegalRequirement」)或類似的訪問字符串?還有什麼我們必須定義的? – 2011-04-11 09:43:50

+0

我用一個關於如何使用AgendaFilter的例子編輯答案。您不必爲任何地方的規則定義元數據。 – 2011-04-11 10:12:34

+0

謝謝。標記爲已接受。 – 2011-04-11 10:20:44

1

您可以修改方法Application.setValid(false)以採取其他參數,這將是法定要求。這樣你可以把它呈現給你的客戶。

+0

我不想改變規則的作用,只是將它與法律要求,法律聯繫起來。 – 2011-04-08 13:21:58

0

我同意紀堯姆·阿爾瓦雷斯,但也請記住,(可能在你的系統)的應用程序可能有幾個原因被拒絕,因此,你可以有這樣的方法:

application.addInvalidReason(SomeType) 

這種方法可能是由相同的應用程序的幾個規則調用...

+0

我不想改變規則的作用,只是將它與法律要求,法律聯繫起來。 – 2011-04-08 13:29:41

相關問題