java - Drools 6 - 如何解雇规则

标签 java drools

我在 drools 6.0.1.Final 中触发简单规则时遇到问题。这是规则:

package org.drools.test
rule "test rule"
when
    eval(true)
then
    System.out.println("success");
end

这是测试代码,控制台没有输出成功

测试 1

// Create kie file system
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();

// Add rule
Resource resource = ResourceFactory.newByteArrayResource(src.getBytes());
kfs.write("org.drools.test.testrule.drl", resource);
kieServices.newKieBuilder(kfs).buildAll();

// Create session
KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(null, RuleBaseConfiguration.class.getClassLoader());
KieBase kieBase = kieContainer.newKieBase(kbaseConf);
KieSession kieSession = kieBase.newKieSession();
kieSession.insert("Test object");

// Fire
kieSession.fireAllRules();
kieSession.dispose();

相比之下,下面的代码片段按预期运行,并且控制台输出成功。问题在于 newStatefulKnowledgeSession 方法已被弃用。据我了解,这不是 Drools 6 中的处理方式。

测试 2

Resource resource = ResourceFactory.newByteArrayResource(src.getBytes());
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(resource, ResourceType.DRL);
StatefulKnowledgeSession ksession = kbuilder.newKnowledgeBase().newStatefulKnowledgeSession();
ksession.insert("Test object");
ksession.fireAllRules();
ksession.dispose();

调试信息

我添加了一些调试行,以尝试了解测试 1 中出了什么问题。

kieSession.addEventListener(new DebugAgendaEventListener());
kieSession.addEventListener(new DebugRuleRuntimeEventListener());

输出是:

==>[ObjectInsertedEventImpl: getFactHandle()=[fact 0:1:1784206373:1217562221:1:DEFAULT:NON_TRAIT:Test object], getObject()=Test object, getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@4984cabc, getPropagationContext()=PhreakPropagationContext [entryPoint=EntryPoint::DEFAULT, factHandle=[fact 0:1:1784206373:1217562221:1:DEFAULT:NON_TRAIT:Test object], leftTuple=null, originOffset=-1, propagationNumber=2, rule=null, type=0]]

而在测试 2 中,输出为:

==>[ObjectInsertedEventImpl: getFactHandle()=[fact 0:1:1784206373:1217562221:1:DEFAULT:NON_TRAIT:Test object], getObject()=Test object, getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@9738e1b, getPropagationContext()=PhreakPropagationContext [entryPoint=EntryPoint::DEFAULT, factHandle=[fact 0:1:1784206373:1217562221:1:DEFAULT:NON_TRAIT:Test object], leftTuple=null, originOffset=-1, propagationNumber=2, rule=null, type=0]]
==>[ActivationCreatedEvent: getActivation()=[[ test rule active=false ] [ null [fact 0:0:1771273200:1306428912:0:DEFAULT:NON_TRAIT:org.drools.core.reteoo.InitialFactImpl@4dde85f0] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@9738e1b]
==>[BeforeActivationFiredEvent:  getActivation()=[[ test rule active=false ] [ null [fact 0:0:1771273200:1306428912:0:DEFAULT:NON_TRAIT:org.drools.core.reteoo.InitialFactImpl@4dde85f0] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@9738e1b]
success
==>[AfterActivationFiredEvent: getActivation()=[[ test rule active=false ] [ null [fact 0:0:1771273200:1306428912:0:DEFAULT:NON_TRAIT:org.drools.core.reteoo.InitialFactImpl@4dde85f0] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@9738e1b]

底线

为什么测试 1 没有触发规则,而测试 2 却触发了?

最佳答案

如果直接使用KieFileSystem,则必须确保内容反射(reflect)所需的maven结构。所以,你应该写:

kfs.write("src/main/resources/org.drools.test.testrule.drl", resource);

或者,在资源上设置sourcePath并直接写入:

resource.setSourcePath( "org.drools.test.testrule.drl" );
kfs.write( resource );

关于java - Drools 6 - 如何解雇规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27907787/

相关文章:

java - 无法从Hadoop MapReduce程序搜索Elasticsearch

java - 如何通过 OSB(Oracle Service Bus)将 BLOB 类型数据(ByteArray)传递到 DB(具有 BLOB 类型列的数据库中的表)

java - 在 Drools 中,如何检查列表是否不包含具有特定值的对象?

java - Drools/Kie-Server/Busines-Central 7.28.0 当 kie-server 访问业务中心上的 websocket Controller 时收到 403

java - 删除附加的字符串到 StringBuilder

Java 数据库功能已删除 - 仍在执行

java - GAE Jersey RESTful 服务 POST JSON

java - Drools Core DRL - 仅触发一条具有最高显着性的规则,跳过其他规则

java - 如何在 Drools 中编写有状态和基于时间的规则?

java - 依赖项 - gradle - drools(版本 4.0.7)