有没有办法在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
答案 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
项目的一部分。