我们可以在jbpm6脚本任务中访问drools规则引擎的工作内存事实吗?

时间:2015-09-29 22:14:01

标签: java drools jbpm

有没有办法在jbpm6脚本任务中访问drools规则引擎的工作内存事实?

我有一个模型类:Application.java 规则:检查薪水是否> 10000(规则组的一部分:salaryCheck)

jbpm flow:start - > salaryCheck(规则任务,与规则组关联:salaryCheck) - > updateScore(脚本任务) - >端

updateScore - 脚本rask代码:

System.out.println(System.out.println((Application)(kcontext.getKieRuntime().getFactHandles().toArray()[0]));

错误:

java.lang.ClassCastException: org.drools.core.common.DefaultFactHandle cannot be cast to org.model.Application

更新了脚本任务:

import org.model.Application
import org.drools.runtime.rule.QueryResults
import org.drools.runtime.rule.QueryResultsRow

QueryResults results = kcontext.getKieRuntime().getQueryResults( "getObjectsOfApplication" ); 
for ( QueryResultsRow row : results ) {
    Application applicantion = ( Application ) row.get( "$result" ); 
    application.setScore(700);
    System.out.println("Application object :: "+ application);
}

为规则drl文件添加了查询

query "getObjectsOfApplication"
    $result: Application()
end

1 个答案:

答案 0 :(得分:1)

getFactHandles()绝对不是您要寻找的方法。认为您正在寻找的方法是getObjects()。无论哪种方式,在没有任何验证的情况下获取返回集合的第一个元素对我来说似乎很危险。您甚至无法保证返回集合中元素的顺序在不同调用之间保持不变。

更好的方法是使用接受getObjects()参数的ObjectFilter版本。一个更好,更具说服力的声明'方法是定义一个查询,返回您要查找的确切对象。然后,您可以使用kcontext.getKieRuntime().getQueryResults()执行查询。

您可以在此主题中更好地了解这两种方法中的任何一种(使用ObjectFilter或查询):Retrieving facts of a specific type from working memory

修改

我建议使用查询或ObjectFilter的帖子是Drools 5代码。在Drools 6中,API类被移动到另一个包中。如果要在代码中调用查询,则应使用这些导入:

  • org.kie.api.runtime.rule.QueryResults
  • org.kie.api.runtime.rule.QueryResultsRow

这些类都是kie-api项目的一部分。