2017-10-10 252 views
0

我構建了一個規則引擎,它在匹配第一條規則後退出。規則的排序使用Salience,鎖定活動(以防止重新匹配)和激活組一旦輸入與第一條規則匹配就立即退出。Drools 7.2:構建規則引擎(監視模式和高性能)

業務現在對監視器模式有新的要求,其中引擎必須繼續將輸入與未處於監視模式的規則相匹配。

例如:

Object(attr1 = 1, attr2 = 2) 

monitor  Rule 1: if (attr1 = 1) 
non-monitor Rule 2: if(attr = 1 and attr2= 2) 
non-monitor Rule 3: .. 

在這裏,應當同時匹配規則1和規則2,但必須儘快規則2匹配,因爲它是在非監視模式(對於更高性能的)出口。監控模式規則僅用於查看它們是否得到評估,並且爲了我們的業務目的而在後端觸發事件。

我目前使用PackageDescBuilder,RuleDescrBuilder等從數據庫動態加載我們的規則。一個簡單的StatelessKieSession用於評估和存儲謂詞中的結果,作爲RHS的一部分。

KieContainer kContainer = ks.newKieContainer(kr.getDefaultReleaseId()); 
    StatelessKieSession kieSession = kContainer.newStatelessKieSession(); 
    kieSession.execute(predicate); 

問:新規則如何構建?我應該爲此探索哪些概念?

我指的是在這份文檔: https://docs.jboss.org/drools/release/7.2.0.Final/drools-docs/html_single/#_rule_attributes

謝謝!

+0

它是更直接調用'fireAllRules(1)'停止已經打響了第一條規則之後。 – laune

回答

1

如果在規則觸發之前需要觸發任何數量的「監視器」規則,應該在第一個「非監視器」規則之後停止,最簡單的方法是在第一個「非監視器」之後調用fireUntilHalt並呼叫halt() 「監視器」已經發射。

要麼在每個「非監視器」規則的末尾放置一個halt()或使用偵聽器。

+0

這應該工作..我會檢查這一點。但是,我必須從無國籍狀態轉變爲有狀態的狀態。 – Shashank

+0

再次感謝。問:我們能在這裏達到平行嗎? kContainer.newKieSession()是處理多個請求的唯一方法,或者可以通過使用kContainer.newStatelessKieSession(kieConfiguration)創建一個kieSession來重用相同的會話; – Shashank

1

如果我正確地理解了這個問題,另一個解決方案可能是將監視器和非監視器規則分爲兩個不同的議程組。受監控的規則不會有任何activation-group屬性,並且未受監控的所有人都會共享相同的activation-group(就像您今天所看到的一樣)。

然後,在執行規則時,請確保您設置了agenda-group的正確順序,以便監視的規則在未受監視的規則之前觸發。

在這種方法中,您也可以使用Laue提到的fireUntilHalt()halt()方法。我用這種方法看到的問題是:

  • 如果你不使用agenda-group,你需要保證你的所有監控規則具有比非監控者更高的顯着性。
  • 對於您的未受監控規則沒有任何匹配的情況,您需要添加一條可能出現的最低規則到halt()

希望它能幫助,

+0

監視器和非監視器規則的排序可以混合使用,因此它們不能位於不同的議程組中。雖然,你說的最後一條默認規則無論如何都需要停下來是對的。謝謝! – Shashank