我正在使用 drools 来验证一个对象。该对象还有一个 getChildrenList() 方法,该方法返回与该对象相关的子对象(主从关系)。
我对对象进行了一些验证,然后我也想验证子对象,因此我使用以下规则将所有子对象插入到工作内存中:
rule "Insert Children"
when
$parent : Parent ( eval(childrenList != empty) )
$ch : Child() from $p.childrenList
then
insert($ch);
end
Run Code Online (Sandbox Code Playgroud)
现在,如果已经插入了子项,我如何确保该规则不会被解雇。我的意思是因为我修改了一些事实,所以规则被重新触发。我怎样才能防止这种情况发生?
谢谢
我正在尝试使用 Drools 作为语法关系到语义映射框架的规则引擎。规则库目前已超过 5000 条规则,并将继续扩展。目前在使用 Drools 时,每次运行程序时,读取包含规则的 drl 文件和创建知识库都会花费大量时间。有没有办法创建一次知识库并将其保存为某种持久格式,可以快速加载仅在进行更改时重新生成知识库的选项?
我在 UI 上有规则配置,它构建为 Java POJO。我如何生成 Drools DRL(传递给其他组件,该组件将匹配事实等,并在规则匹配时返回 true 或 false)。
我还从数据库收到 DRL 文件,为了在 UI 上显示规则,我需要转换回 Java POJO。
基本上有没有任何工具或脚本可以在 Java POJO 和 Drools DRL 文件之间进行转换?如果没有,最好的方法是什么?
非常感谢!
我一直在阅读一篇关于 Drools 性能的文章(JBoss Drools \xe2\x80\x93 Performance and Memory Internals),它解释了如何创建 Rete 树和节点,Drools 如何索引它们,以及为什么增加 Drools 中的对象数量几乎不会影响执行它所花费的总时间。\n以智能方式编写的规则可以大大减少 Rete Tree 中的节点数量,从而进一步提高性能。
\n\n我想知道是否有 Drools 规则编写最佳实践,这样我就可以以一种可以尽快执行的方式编写它们。
\n\n谢谢。
\n在 drools 规则中,想要测试布尔字段 isValid 的值(注意:字段名称以“is”开头)。出现以下错误:
无法为规则“测试布尔内容”中的“[ClassObjectType class=domain.SpecialObject]”的“isValid”创建字段提取器:[规则名称=“测试布尔内容”]线程“main”中出现异常 java.lang.IllegalArgumentException:无法解析 drl 文件。
然而,规则中的另一个布尔字段“solid”工作得很好。
环境:Drools 版本 - 5.1.1,dialect=mvel
<Drl file>
import deshaw.compliance.regsys.dep.domain.SpecialObject;
dialect "mvel"
rule "Test boolean stuff"
no-loop
when
$obj: SpecialObject(isValid == true) // -->Problematic guy
//$obj: SpecialObject(solid == true) // -->This works fine
then
System.out.println("[SplObject]:Class=" + $obj.class + ";;;obj=" + $obj);
end
<domain object>
public class SpecialObject {
private boolean isValid;
private boolean solid;
public boolean isValid() {
return isValid;
}
public void setValid(boolean isValid) {
this.isValid = isValid;
}
public …
Run Code Online (Sandbox Code Playgroud) 我目前开始使用 jbpm/drools 并尝试使用“业务规则任务”从我的 DRL 修改一些流程变量。我尝试了以下过程,该过程声明了“MyCustomObject”类型的变量“var”。
根据此问题和此建议的结果,我创建了一个任务,该任务应执行规则流组“testgroup”并具有以下 onEntry 脚本:
kcontext.getKnowledgeRuntime().insert(kcontext.getProcessInstance());
Run Code Online (Sandbox Code Playgroud)
我的 DRL 现在看起来像这样:
import mypackage.MyCustomObject;
import org.kie.api.runtime.process.WorkflowProcessInstance;
rule "generate object"
ruleflow-group "testgroup"
when
//some stuff applies
then
insert(new MyCustomObject());
end
rule "modify variable"
ruleflow-group "testgroup"
when
$process: WorkflowProcessInstance()
$obj: MyCustomObject()
then
WorkflowProcessInstance $p = (WorkflowProcessInstance)kcontext.getKieRuntime().getProcessInstance($process.getId());
$p.setVariable( "var", $obj);
System.out.println("Value of object in memory: "+$obj);
System.out.println("Value of object in variable:+$p.getVariable("var"));
retract($process);
end
Run Code Online (Sandbox Code Playgroud)
在业务规则任务之后,我放置了一个简单的脚本任务:
if(var != null) {
System.out.println("var: "+var);
} else{
System.out.println("var is null!");
}
Run Code Online (Sandbox Code Playgroud)
我现在得到的输出是(注意:MyCustomObject 不会覆盖 toString):
内存中对象的值:MyCustomObject@XYZ …
我有一个相当简单的情况,我想检查规则条件中属性是否不为空。
rule "only do action if attribute is not null"
when
$fact : Fact(attribute!=null, $attribute : attribute)
then
rulesLogger.debug("Rule fires = " + $attribute);
end
Run Code Online (Sandbox Code Playgroud)
我已经在调试中跟踪了这一点。正在插入属性为 null 的事实,但规则仍会触发。控制台输出如下。
Rule fires = null
Run Code Online (Sandbox Code Playgroud)
如果我将条件更改为,attribute==null
则规则不会触发。所以它的表现似乎与我的预期完全相反。
我们确实有一个使用函数来解决这个问题的方法,但它有点丑陋,我不明白为什么它首先不起作用。
function Boolean attributeExists(Fact fact)
{
if(fact.getAttribute() == null)
{
return Boolean.FALSE;
}
else
{
return Boolean.TRUE;
}
}
rule "only do action if attribute is not null"
when
$fact : Fact($attribute : attribute)
Boolean(booleanValue == true) from attributeExists($fact)
then
rulesLogger.debug("Rule fires = " + …
Run Code Online (Sandbox Code Playgroud) 我收到 NoSuchMethodError
错误是:
Caused by: java.lang.NoSuchMethodError: com.google.common.cache.CacheBuilder.maximumSize(J)Lcom/google/common/cache/CacheBuilder;
at springfox.documentation.spring.web.scanners.CachingOperationReader.<init>(CachingOperationReader.java:44) ~[springfox-spring-web-2.7.0.jar:2.7.0]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_172]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_172]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_172]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_172]
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:170) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
... 60 common frames omitted
Run Code Online (Sandbox Code Playgroud)
我认为错误的原因是因为 CacheBuilder 在两个 jar 中可用。我正在构建一个带有流口水和招摇的弹簧靴产品。我的依赖项列表包含以下依赖项
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-ci</artifactId>
<version>${kie.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
现在kie-ci
有sisu-guava
和swagger
有guava
罐子,我发现通过运行
mvn dependency:tree -Dverbose | grep guava
$ mvn dependency:tree -Dverbose | grep guava
[INFO] | | | \- org.sonatype.sisu:sisu-guava:jar:0.9.9:compile
[INFO] +- com.google.guava:guava:jar:18.0:compile
Run Code Online (Sandbox Code Playgroud)
依赖树的输出是
$ mvn …
Run Code Online (Sandbox Code Playgroud) 我了解最新版本的 Drools (7.47) 取消了 Eclipse Java 编译器的范围(https://docs.jboss.org/drools/release/7.47.0.Final/drools-docs/html_single/#drools-ecj),但是这个破坏了与 Eclipse 的集成。我不再在 .drl 文件中进行语法/错误解析,无法显示 Rete 树,并且该项目存在构建错误:
java.lang.ClassNotFoundException: org.drools.ecj.EclipseJavaCompiler cannot be found by org.drools.eclipse_7.47.0.Final
(这个错误对于Rete树和构建项目是一样的)
这是 Drools 中的一个错误,将在下一版本中修复,还是我需要解决的配置问题?如果是配置问题,我需要做什么?
如何在启动时从数据库表加载规则并从Drools 6.2.0中的同一个表更新它们?我找到了一个使用Drools 5 的例子,我可以将其从Scala转换为Java,但看起来API已经发生了巨大变化......例如,我没有看到RuleBaseFactory类.
任何样品或文件将不胜感激.
drools ×10
java ×5
eclipse ×1
jbpm ×1
kie-wb ×1
rete ×1
rule ×1
rule-engine ×1
spring-boot ×1
swagger-2.0 ×1