使用 QueryResults 没有 return 任何东西

Using QueryResults does not return anything

我正在尝试使用 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) returns 什么都没有,一段时间后我不得不手动终止执行。

这里有什么问题?

我认为这里的问题是你的线程被阻止了。如果您的要求是将会话中的事实数量作为规则的一部分进行计数,那么您可以使用累加器以更多 "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

希望对您有所帮助,