2010-11-29 61 views
1

在我的公司,我們計劃在幾個項目中使用Drools a BRE。現在我們試圖定義一些最佳做法。Drools - 在規則條件或後果內做複雜的東西

我的問題是應該是什麼,應該不是一個規則條件/結果內進行。 鑑於我們可以直接編寫Java或調用方法(例如,從工作內存中的全局對象)。

例子。給定一個評估通用對象(例如Person)屬性設置爲true的規則。現在,該特定屬性只能定義爲該對象進入數據庫並獲取該信息。因此,我們必須執行該兩種方式:

備選方案A:

  • 轉到數據庫並獲取對象屬性(真/假代碼)
  • 插入對象在工作存儲器
  • 評估規則

替代B:

  • 插入具有連接到數據庫的方法全局對象和檢查的財產給定對象。
  • 插入對象在工作記憶
  • 在規則EVAL,調用全局對象並執行訪問數據庫

其中那些被認爲是更好?我非常喜歡A,但是有時B更直接,但是如果像數據庫中的Exception那樣引發了什麼,會發生什麼?

我已經看到了由Packt出版Drools的5.0書實施的替代B,但是他們正在做的嘲弄,他們不談論要去的數據庫中所有的實際意義。

謝謝

回答

1

我也有一個需要抓住從其他系統(數據庫,服務電話等),外部數據,所以我已經處理了這一點。就我個人而言,我會根據您是否知道您事先需要哪些事實來做出決定。如果是這樣,那麼通過一切手段,隨意使用Java進行調用。這將允許你做更好的錯誤處理。如果無法檢索某些數據,意味着運行規則引擎是不行的,您將避免創建會話,插入事實,設置全局變量等工作。如果你只是暫停(),沒有意義。

但是,當然也有不能檢索數據不應阻止你運行的情況。在其中一些情況下,備選方案A和B將同樣奏效。但是,假設需要某些數據取決於其他事情。例如,我在一個應用程序上工作,該應用程序評估實質上是大邏輯樹,並使用來自服務調用的數據評估葉子。如果兩片葉子被安放在一起,所以兩者必須是真的,因爲它們的分支是真的,只要其中一個被評估爲假,那個分支就變成假,我不再需要評估另一片葉子。這意味着預先加載我需要的數據來評估它是件浪費。 「隨需應變」檢索數據是像Jess這樣的規則引擎除了缺省前向鏈之外還支持backward chaining的原因之一。

直到反向鏈接is complete在Drools中,我見過的另一種選擇是使用"from" keyword。我有一些運氣,但有兩件事需要考慮:

  1. Drools在規則引擎運行時反覆查詢「from」語句。我在服務層使用緩存,所以這與HashMap查找一樣有害,但是如果你不緩存,你可能會冒不知不覺造成數十,數百或數千服務調用的風險。
  2. 如果您沒有找到您期望的數據,則無法進行錯誤處理。這就是史蒂文希律所提到的。規則引擎將繼續執行,並將繼續評估您給出的表達式。在需要採取一些措施(例如調用halt())的情況下,我會根據規則的結果進行服務調用。

我希望這會有所幫助。讓我知道,如果有任何我可以澄清或擴大。

+1

我們也在考慮使用Drools Flow/Salience組合來定義我們是否需要「加載」數據(基於定義的標準)。此外,「from」關鍵字可用於管理複雜層次結構,而無需在工作內存中插入所有對象。 – mfcabrera 2011-02-04 14:41:01

2

的事情之一,有關規則是,他們可以執行很多次。特別是如果您在規則條件下犯錯。這顯然會對性能產生影響。

我傾向於再喜歡選項A,外面準備你的事實,並將其插入到用於評估工作記憶。

當然,也有分區的規則爲數據加載規則,那麼業務規則評估(例如使用規則流)的選項。

這會給你聲明控制填充代碼之外的數據。

+0

提及「多次,多次」+1。我即將發表類似的評論。 – 2010-12-29 05:53:49