2015-10-17 62 views
0

我們有一套主規則。其中一條規則類似於以下規則:如何覆蓋Drools 6中的規則和決策表?

rule "Check Eligibility" 
when 
    $response(type=="rest",age== 25) 
then 
    $response.setSendLetter("Y"); 
    $response.setUpdateStatus("eligible"); 
end 

這些規則將提供給客戶。我們希望我們的客戶能夠自定義規則。如果決定不定製,則規則應適用於他們。自定義可能會在「何時」添加附加條件,或者可能會覆蓋現有條件並添加或修改「何時」部分。他們也可以添加到「那麼」的規則的一部分。

喜歡的東西:

rule "Check Eligibility" 
when 
    $response(type=="rest",age== 27, state="IL") 
then 
    $response.setSendLetter("N"); 
    $response.setUpdateStatus("eligible"); 
    $response.setSendEmail("Y"); 
end 

我們也有類似的需要定製一些決策表。

從規則來看,最初的建議是使用「擴展」,但從我所知道的「擴展」作爲「AND」來檢查父母和孩子的條件,如果兩者都是真的,它會做「then」部分。

我想到的可能解決方案是克隆每個客戶的主存儲庫,然後每當主存儲庫規則發生變化時,我們會拉動客戶存儲庫。可能的問題可能是偶爾出現的可能需要手動解決的合併衝突。

團隊中尚未接受克隆解決方案,因此想知道爲規則和決策表實現「覆蓋」的可能解決方案是什麼?

回答

0

存在技術問題和管理問題。

如果您的管理層決定讓客戶混淆規則,他們必須意識到後果。顯然,客戶不應該被單獨留下他們的規則,但您的組織仍然要對整個應用程序的無瑕疵功能負責。 你無法免費這樣做,而更多的客戶有更多的餘地,它會得到更多的費用。

沒有舒適的技術解決方案。擴展名不適用於您所描述的修改:必須替換規則。

  1. 您可以(如您所寫)複製DRL文件(在您的CM系統中創建一個分支)並讓客戶編輯。這是一個乾淨的方法;您可以使用其他測試(另一個要分支的CM項目)測試客戶的基線,並使用衆所周知的CM技術進行部署。
  2. 另一種方法是讓客戶編寫另一個包含需要更改的規則的DRL文件。但是你不能編譯這個DRL文件和原始文件一起;不允許複製規則。有解決方法,例如,通過替換已編譯的KiePackages中的規則,或者禁用KieBase中的重寫規則,但它們具有需要使用非穩定內部API的不確定含義。
  3. 您可以嘗試並定義允許客戶使用的DRL語言的子集,並使用某些基於子集(可能是XML或類似語言)的DSL編寫和覆蓋規則。然後,發電機可以檢查數據並創建DRL文本。採用這種方法,覆蓋是一個簡單的功能,由生成器處理。但是需要大量的開發工作。

就作爲電子表格寫在Excel文件中的決策表而言,無論如何您都需要克隆。我想不出任何其他解決方案來修改這些規則集。

+0

Thanks @laune!非常感謝解釋性回覆。是的,#1是我想要的,因爲我們必須在2個月後才能生活。我們還有決策表,無論如何都必須複製。我們還計劃提供自定義用戶界面,只顯示用「特定於域的語言」編寫的規則,並允許他添加更多規則。對於現有的規則,我們必須小心謹慎,正如您正確指出的那樣。 – raj