• drools规则的入门使用


    1:pom文件

    <!--drools-->
    <dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>7.10.0.Final</version>
    </dependency>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    </dependency>

    2.新建 kmodule.xml

    路径 resources\META-INF\kmodule.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <kmodule xmlns="http://www.drools.org/xsd/kmodule">
    <kbase name="rules">
    <ksession name="all-rules"/>
    </kbase>
    </kmodule>

    3.drl 文件
    路径 resources\rules\test.drl

    import com.example.serviceorder.vo.Person

    dialect "mvel"

    rule "age"
    when
    $person : Person(name=='小明')
    then
    $person.setAge(11);
    System.out.println("我叫:"+$person.getName()+",现在:"+$person.getAge()+"岁");
    end

    rule "age1"
    when
    $person : Person(name=='小黑')
    then
    $person.setAge(13);
    System.out.println("我叫:"+$person.getName()+",现在:"+$person.getAge()+"岁");
    end

    rule "age2"
    when
    $person : Person(name=='小白')
    then
    $person.setAge(14);
    System.out.println("我叫:"+$person.getName()+",现在:"+$person.getAge()+"岁");
    end
    4. 实体
    package com.example.serviceorder.vo;

    /**
    * @author lwq
    * @date 2022/6/5 21:38
    * @desciption: 测试
    */
    public class Person {

    private String name;
    private int age;

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public int getAge() {
    return age;
    }

    public void setAge(int age) {
    this.age = age;
    }
    }

    5.测试类

    private static KieContainer container = null;
    private KieSession statefulKieSession = null;

    @Test
    public void test111() {

    KieServices kieServices = KieServices.Factory.get();
    container = kieServices.getKieClasspathContainer();
    statefulKieSession = container.newKieSession("all-rules");
    Person person = new Person();


    person.setName("小白");

    statefulKieSession.insert(person);
    statefulKieSession.fireAllRules();
    statefulKieSession.dispose();
      System.out.println(JSON.toJSON(person));

    }
    6.打印结果
    {"name":"小白","age":14}

    7.动态加载规则工具类

    package com.example.serviceorder.util;

    import org.kie.api.KieServices;
    import org.kie.api.builder.KieBuilder;
    import org.kie.api.builder.KieFileSystem;
    import org.kie.api.builder.KieRepository;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.KieSession;

    /**
    * @author lwq
    * @date 2022/6/5 22:02
    * @desciption: Drools工具类
    */
    public class DroolsUtil {
    private static KieContainer container = null;

    public static <T> T execute(T t, String rule) {

    container = load(rule);
    KieSession kieSession = container.newKieSession();
    kieSession.insert(t);
    kieSession.fireAllRules();
    kieSession.dispose();
    return t;
    }


    private static KieContainer load(String rule) {

    KieServices kieServices = KieServices.Factory.get();
    KieRepository repository = kieServices.getRepository();

    KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
    kieFileSystem.write("src/main/resources/rules" + "test.drl", rule);
    KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
    kieBuilder.buildAll();

    return kieServices.newKieContainer(repository.getDefaultReleaseId());

    }
    }
    8.测试动态加载规则工具类
    @Test
    public void test1112() {
    //rule 规则可以存在数据库一个字段里面 oracle 数据库可以使用 clob 类型
    //mysql 数据库可以使用 longtext类型
    //也可以放到 redis 里面
        String rule="\n" +
    "import com.example.serviceorder.vo.Person\n" +
    "\n" +
    "dialect \"mvel\"\n" +
    "\n" +
    "rule \"age\"\n" +
    " when\n" +
    " $person : Person(name=='小明')\n" +
    " then\n" +
    " $person.setAge(11);\n" +
    " System.out.println(\"我叫:\"+$person.getName()+\",现在:\"+$person.getAge()+\"岁\");\n" +
    "end\n" +
    "\n" +
    "rule \"age1\"\n" +
    " when\n" +
    " $person : Person(name=='小黑')\n" +
    " then\n" +
    " $person.setAge(13);\n" +
    " System.out.println(\"我叫:\"+$person.getName()+\",现在:\"+$person.getAge()+\"岁\");\n" +
    "end\n" +
    "\n" +
    "rule \"age2\"\n" +
    " when\n" +
    " $person : Person(name=='小白')\n" +
    " then\n" +
    " $person.setAge(14);\n" +
    " System.out.println(\"我叫:\"+$person.getName()+\",现在:\"+$person.getAge()+\"岁\");\n" +
    "end";

    Person person = new Person();


    person.setName("小明");


    DroolsUtil.execute(person, rule);

    System.out.println(JSON.toJSON(person));
    }

    6.打印结果
    {"name":"小明","age":11}




     
  • 相关阅读:
    git remote: Support for password authentication was removed on August 13, 2021
    win10 安装vue 详解包括node.js、npm、webpack
    solr window 安装与启动
    solr 创建 core
    idea 创建 springboot 模块报错解决
    c# 设计模式篇
    javascript(DHTML)代码和客户端应用程序代码之间实现双向通信.
    委托,匿名方法,Lambda 表达式 的关系
    使用泛型实现单例模式提供者
    asp.net 文件编码问题
  • 原文地址:https://www.cnblogs.com/wanqiang/p/16345455.html
Copyright © 2020-2023  润新知