我试图通过使用QueryResults来计算对象的数量。我的规则是:
query "Test"
m : Message()
end
function int countFacts(String queryString) {
QueryResults queryResults = DroolsTest.getQueryResults(queryString);
if (queryResults != null) {
System.out.println("Total FACTS found: " + queryResults.size());
return queryResults.size();
}
return 0;
}
rule "Hello World"
when
m : Message( status == Message.HELLO, myMessage : message )
eval(countFacts("Test")>0 )
then
System.out.println( myMessage );
end
在java方面
public static QueryResults getQueryResults(String queryName) {
System.out.println("inside queryResults for queryName " +queryName );
QueryResults queryResults = kSession.getQueryResults(queryName);
return queryResults;
}
当我尝试运行规则时,执行停止并且没有任何反应。 kSession.getQueryResults(queryName)什么都不返回,一段时间后我必须手动终止执行。
这里有什么问题?
答案 0 :(得分:0)
我认为这里的问题是你的线程被阻止了。如果您的要求是将会话中的事实数量作为规则的一部分进行计算,那么您可以在更多" Drools-friendly"使用累积的方式:
rule "More than 2 HELLO messages"
when
Number(longValue > 2) from accumulate (
Message( status == Message.HELLO),
count(1)
)
then
System.out.println( myMessage );
end
如果您确实想要从规则的when
部分调用查询,则需要pass an unbound variable to the query才能将结果返回到规则中:
query countMessages(long $n)
Number($n:= longValue) from accumulate (
Message(),
count(1)
)
end
rule "Hello World"
when
m : Message( status == Message.HELLO, myMessage : message )
countMessages($n;)
eval($n > 0)
then
System.out.println( m );
end
希望它有所帮助,