首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们可以访问jbpm6脚本任务中drools规则引擎的工作记忆事实吗?

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

Stack Overflow用户
提问于 2015-09-29 22:14:01
回答 1查看 2K关注 0票数 1

有没有一种方法可以访问jbpm6脚本任务中drools规则引擎的工作记忆事实?

我有一个模型类: Application.java规则:检查工资是否大于10000 (规则组的一部分: salaryCheck )

jbpm流:启动-> salaryCheck(规则任务,关联规则组: salaryCheck) -> updateScore(脚本任务) -> end

updateScore -脚本rask代码:

代码语言:javascript
复制
System.out.println(System.out.println((Application)(kcontext.getKieRuntime().getFactHandles().toArray()[0]));

错误:

代码语言:javascript
复制
java.lang.ClassCastException: org.drools.core.common.DefaultFactHandle cannot be cast to org.model.Application

更新的脚本任务:

代码语言:javascript
复制
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文件添加查询

代码语言:javascript
复制
query "getObjectsOfApplication"
    $result: Application()
end
EN

回答 1

Stack Overflow用户

发布于 2015-09-30 14:08:32

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

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

您可以在以下线程中更好地理解这2种方法(使用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项目的一部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32854650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档