Drools 6 - 如何触发规则
Drools 6 - How to Fire Rule
我在 drools 6.0 中触发简单规则时遇到问题。1.Final。这是规则:
package org.drools.test
rule "test rule"
when
eval(true)
then
System.out.println("success");
end
这是测试代码,控制台不输出success
。
测试 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();
相比之下,下面的代码片段按预期运行,并且控制台输出 success
。问题是方法 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,必须确保内容反映了所需的maven结构。所以,你应该写:
kfs.write("src/main/resources/org.drools.test.testrule.drl", resource);
或者,在资源上设置 sourcePath 并直接写入:
resource.setSourcePath( "org.drools.test.testrule.drl" );
kfs.write( resource );
我在 drools 6.0 中触发简单规则时遇到问题。1.Final。这是规则:
package org.drools.test
rule "test rule"
when
eval(true)
then
System.out.println("success");
end
这是测试代码,控制台不输出success
。
测试 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();
相比之下,下面的代码片段按预期运行,并且控制台输出 success
。问题是方法 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,必须确保内容反映了所需的maven结构。所以,你应该写:
kfs.write("src/main/resources/org.drools.test.testrule.drl", resource);
或者,在资源上设置 sourcePath 并直接写入:
resource.setSourcePath( "org.drools.test.testrule.drl" );
kfs.write( resource );