drools7 (四、FactHandle 介绍)

先看代码

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 可以直接定位、修改、删除操作。

原文地址:https://www.cnblogs.com/xiaojf/p/8338206.html