先看代码
Base.java
package cn.xiaojf.drools7.base; import org.apache.commons.lang3.StringUtils; import org.kie.api.KieServices; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; public class Base { public KieSession getSession() { KieServices kieServices = KieServices.Factory.get(); KieContainer kieContainer = kieServices.getKieClasspathContainer(); //kmodule.xml 中定义的 ksession name KieSession kieSession = kieContainer.newKieSession("all-rules"); return kieSession; } public KieSession getSession(String agendaGroupName) { KieSession session = this.getSession(); if (StringUtils.isNoneBlank(agendaGroupName)) { session.getAgenda().getAgendaGroup(agendaGroupName).setFocus(); } return session; } }
FaceHandleTest.java
package day20180123; import cn.xiaojf.drools7.base.Base; import cn.xiaojf.drools7.model.Person; import org.junit.Test; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.rule.FactHandle; import java.util.logging.Handler; /** * 测试 Facehandler * @author xiaojf 2018/1/23 21:35 */ public class FaceHandleTest extends Base { @Test public void test() { KieSession kieSession = super.getSession("faceHandleTest"); Person p = new Person(); p.setAge(30); FactHandle faceHandle = kieSession.insert(p); //触发rules int count = kieSession.fireAllRules(); System.out.println(p.getName()); //在 work memory 中的对象描述信息 System.out.println(faceHandle.toExternalForm()); p.setAge(10); //更新work memory 中的对象信息 kieSession.getAgenda().getAgendaGroup("faceHandleTest").setFocus(); kieSession.update(faceHandle,p); kieSession.fireAllRules(); Person p2 = (Person) kieSession.getObject(faceHandle); System.out.println(p2.getName());
//删除
//kieSession.delete(faceHandle);
} }
faceHandle.drl
package cn.xiaojf.rules import cn.xiaojf.drools7.model.Person rule "faceHandleTest-less-20" agenda-group "faceHandleTest" when $p : Person(age < 20) then $p.setName("less 20"); end rule "faceHandleTest-more-20" agenda-group "faceHandleTest" when $p : Person(age > 20) then $p.setName("more 20"); end
结果
D:softjavajdk1.8.0_91injava -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:softJetBrainsIntelliJ IDEA 2017.2.1libidea_rt.jar=9137:D:softJetBrainsIntelliJ IDEA 2017.2.1in" -Dfile.encoding=UTF-8 -classpath "D:softJetBrainsIntelliJ IDEA 2017.2.1libidea_rt.jar;D:softJetBrainsIntelliJ IDEA 2017.2.1pluginsjunitlibjunit-rt.jar;D:softJetBrainsIntelliJ IDEA 2017.2.1pluginsjunitlibjunit5-rt.jar;D:softjavajdk1.8.0_91jrelibcharsets.jar;D:softjavajdk1.8.0_91jrelibdeploy.jar;D:softjavajdk1.8.0_91jrelibextaccess-bridge-64.jar;D:softjavajdk1.8.0_91jrelibextcldrdata.jar;D:softjavajdk1.8.0_91jrelibextdnsns.jar;D:softjavajdk1.8.0_91jrelibextjaccess.jar;D:softjavajdk1.8.0_91jrelibextjfxrt.jar;D:softjavajdk1.8.0_91jrelibextlocaledata.jar;D:softjavajdk1.8.0_91jrelibext ashorn.jar;D:softjavajdk1.8.0_91jrelibextsunec.jar;D:softjavajdk1.8.0_91jrelibextsunjce_provider.jar;D:softjavajdk1.8.0_91jrelibextsunmscapi.jar;D:softjavajdk1.8.0_91jrelibextsunpkcs11.jar;D:softjavajdk1.8.0_91jrelibextzipfs.jar;D:softjavajdk1.8.0_91jrelibjavaws.jar;D:softjavajdk1.8.0_91jrelibjce.jar;D:softjavajdk1.8.0_91jrelibjfr.jar;D:softjavajdk1.8.0_91jrelibjfxswt.jar;D:softjavajdk1.8.0_91jrelibjsse.jar;D:softjavajdk1.8.0_91jrelibmanagement-agent.jar;D:softjavajdk1.8.0_91jrelibplugin.jar;D:softjavajdk1.8.0_91jrelib esources.jar;D:softjavajdk1.8.0_91jrelib t.jar;E:workspacedrools7-demo arget est-classes;E:workspacedrools7-demo argetclasses;E:m2 epositoryjunitjunit4.12junit-4.12.jar;E:m2 epositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar;E:m2 epositoryorgkiekie-api7.5.0.Finalkie-api-7.5.0.Final.jar;E:m2 epositoryorgkiesoupkie-soup-maven-support7.5.0.Finalkie-soup-maven-support-7.5.0.Final.jar;E:m2 epositoryorgslf4jslf4j-api1.7.25slf4j-api-1.7.25.jar;E:m2 epositoryorgdroolsdrools-compiler7.5.0.Finaldrools-compiler-7.5.0.Final.jar;E:m2 epositoryorgkiekie-internal7.5.0.Finalkie-internal-7.5.0.Final.jar;E:m2 epositoryorgkiesoupkie-soup-commons7.5.0.Finalkie-soup-commons-7.5.0.Final.jar;E:m2 epositoryorgkiesoupkie-soup-project-datamodel-commons7.5.0.Finalkie-soup-project-datamodel-commons-7.5.0.Final.jar;E:m2 epositoryorgkiesoupkie-soup-project-datamodel-api7.5.0.Finalkie-soup-project-datamodel-api-7.5.0.Final.jar;E:m2 epositoryorgantlrantlr-runtime3.5.2antlr-runtime-3.5.2.jar;E:m2 epositoryorgeclipsejdtcorecompilerecj4.4.2ecj-4.4.2.jar;E:m2 epositoryorgmvelmvel22.4.0.Finalmvel2-2.4.0.Final.jar;E:m2 epositorycom houghtworksxstreamxstream1.4.10xstream-1.4.10.jar;E:m2 epositoryxmlpullxmlpull1.1.3.1xmlpull-1.1.3.1.jar;E:m2 epositoryxpp3xpp3_min1.1.4cxpp3_min-1.1.4c.jar;E:m2 epositorycomgoogleprotobufprotobuf-java2.6.0protobuf-java-2.6.0.jar;E:m2 epositoryorgdroolsdrools-core7.5.0.Finaldrools-core-7.5.0.Final.jar;E:m2 epositorycommons-codeccommons-codec1.10commons-codec-1.10.jar;E:m2 epositoryorgapachecommonscommons-lang33.7commons-lang3-3.7.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 day20180123.FaceHandleTest,test SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. more 20 0:1:429058804:429058804:1:DEFAULT:NON_TRAIT:cn.xiaojf.drools7.model.Person less 20 Process finished with exit code 0
facehandler 相当于是work memory 中对象的句柄,通过facehandler 可以直接定位、修改、删除操作。