使用QueryResults不会返回任何内容

时间:2018-03-05 15:57:53

标签: drools

我试图通过使用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)什么都不返回,一段时间后我必须手动终止执行。

这里有什么问题?

1 个答案:

答案 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

希望它有所帮助,