有幾種方法可以做到這一點,具體取決於您使用的是無狀態還是有狀態會話。
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");
你不想堅持這個bean嗎?如果是的話,你應該看看kstore。 – zenbeni
@zenbeni感謝您的回覆。你能舉個簡單的例子說明我該怎麼做。 – newbie
fyi - 我懷疑你的規則LHS應該是$ m:FLTBean(listeningScore> 85,listeningScore <101)......這會讓你激活這兩個值之間的bean。您的規則匹配2個FLTBean事實,其中一個得分> 85,另一個得分<101 – Steve