2013-11-09 34 views
0

我對流口水很新,但我想將它集成到我現有的項目中。我正在使用Spring MVC框架。我從drools的免費項目成功實施了簡單的示例hello world。我現在想要做的是:在web應用上流口水

  1. 發送一個bean給它的規則來評估。
  2. 根據規則修改bean
  3. 將其發送回控制器以對用戶做出響應。

第1步我已經完成了它。我能夠在規則中插入bean。我有什麼,現在在我的規則是這樣的:

global String $test; 

rule "Excellent" 

    when 
     $m: FLTBean (listeningScore > 85) 
     $p: FLTBean (listeningScore < 101) 
    then 
     $test = "Excellent"; 
     System.out.println($test); 

end 

對於第2步第3步我不知道我怎麼能做到這一點。如果可能的話,請給我一個簡單的代碼,以便能夠做到這一點。我想要嵌套規則。以2個嵌套規則作爲例子會很好。

在此先感謝。

+0

你不想堅持這個bean嗎?如果是的話,你應該看看kstore。 – zenbeni

+0

@zenbeni感謝您的回覆。你能舉個簡單的例子說明我該怎麼做。 – newbie

+1

fyi - 我懷疑你的規則LHS應該是$ m:FLTBean(listeningScore> 85,listeningScore <101)......這會讓你激活這兩個值之間的bean。您的規則匹配2個FLTBean事實,其中一個得分> 85,另一個得分<101 – Steve

回答

0

一種選擇是爲bean編寫查詢,以便在規則執行後從規則引擎中將其返回。如果要獲取大量的bean,這可能會變得很麻煩。 The docs show you an examples of this approach

另一個選擇可能是讓全局集合在規則執行結束時收集所有的bean。只要確保「收集」規則是低顯着性的,以便它最後執行。這個規則就像下面這樣

rule 'collect results' 
    salience -500 
    when 
    $beans : ArrayList() from collect(MyBean()) 
    then 
    someGlobal.setBeans($beans); 
end 

事實上,如果你願意,你可以直接添加到全局列表中。如果您不想要所有的豆子,您還可以在collect中添加一些條件。

+0

您還可以添加如何收集豆類你發佈的第二個選項? – newbie

+0

@newbie請檢查Drools文檔的鏈接。關於如何編寫查詢規則以及如何在Java端調用它,有一個簡單的例子。 – kaskelotti

+0

我的意思是你說的第二個選項。設置全局集合。 – newbie

1

有幾種方法可以做到這一點,具體取決於您使用的是無狀態還是有狀態會話。

rule "Excellent" 
    no-loop 
when 
    $m: FLTBean (listeningScore > 85 && listeningScore < 101) 
then 
    $m.setRating("Excellent") 
    update($m) 
end 

在這種情況下,對於一個無狀態會話Java代碼可能是:

FLTBean flt = new FLTBean(); 
flt.setScore(91); 
List<Object> facts = new ArrayList<Object>(); 
facts.add(flt); 
ksession.execute(facts); 
System.out.println("Result is " + flt.getRating()); 

如果您使用的是有狀態會話,那麼你可以插入事實,消防規則,然後查詢事實了工作的記憶。您的規則可以插入新的事實到工作內存中,像這樣:

rule "Excellent" 
when 
    $m: FLTBean (listeningScore > 85 && listeningScore < 101) 
then 
    insert(new FLTResult("Excellent")) 
end 

要得到的結果回來了一遍,你可以使用Drools的API來查找工作內存的任何對象。

/** Provide a reference to the session and the class name 
* of the fact you are searching for. 
*/ 
public Collection<Object> findFacts(final StatefulKnowledgeSession session, 
     final String factClass) { 

    ObjectFilter filter = new ObjectFilter() { 
     @Override 
     public boolean accept(Object object) { 
      return object.getClass().getSimpleName().equals(factClass); 
     } 
    }; 

    Collection<Object> results = session.getObjects(filter); 
    return results; 
} 

// And call that like so: 
FLTBean flt = new FLTBean(); 
flt.setScore(91); 
ksession.insert(flt); 
ksession.fireAllRules(); 
results = findFacts(ksession, "FLTResult"); 
+0

+1的感謝信息,比給出的答案更詳細。 – newbie

+0

Steve我有一個關於這行'insert(new FLTResult(「Excellent」))的問題''我可以做這個'insert(FLTBean.setRating(「Excellent」))'? – newbie

+0

不,但您可以這樣做:FLTResult fltr = new FLTResult(); fltr.setRating( 「優異」);插入(FLTR);這只是創建類的一個實例所需的任何Java代碼,後跟一個插入(......)將其放入工作內存中以便規則可以對其執行操作。 – Steve