Drools实践与动态加载

Drools简介

Drools是一款基于Java的开源规则引擎,将规则与业务代码解耦。规则以脚本的形式存储在一个文件中,使规则的变化不需要修改代码,重新启动机器即可在线上环境中生效。

规则引擎实现了业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入、解释业务规则,以及基于业务规则做出业务决策,从而提供极大的编程便利。

对系统使用人员来说:

  • 将业务规则的创建、修改、维护透明话;
  • 提高业务灵活度;
  • 减少对开发人员的依赖;
  • 避免业务升级带来的风险

对开发人员来说:

  • 增加代码灵活性;
  • 降低系统维护成本,提高系统可维护性;
  • 解耦业务与规则,减少代码修改成本;
  • 简化系统架构,优化应用结构;

Drools架构图

在这里插入图片描述

快速开始

1. Maven导入

  <drools.version>7.23.0.Final</drools.version>
  <lombok.version>1.18.2</lombok.version>

 <dependency>
            <groupId>org.kie.server</groupId>
            <artifactId>kie-server-client</artifactId>
            <version>${drools.version}</version>
 </dependency>

 <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-compiler</artifactId>
      <version>${drools.version}</version>
 </dependency>

2.Java整合
框架: spring-boot 、Lombok

@Data
public class Person {
    private String name;
    private int age;
}

3.drl文件的编写,resources下创建rules目录,并编写

import  com.mkun.drools.bean.Person;  //导入对应bean [?*]
dialect  "mvel"

rule "drools-test"
    when
         $person: Person(age < 16 || age > 50)
    then
         System.out.println("该人员年龄不符合规则");
end

在对应路径添加Kie文件,resources下创建META-INF文件夹,并且创建文件kmodule.xml

<kmodule xmlns="http://www.drools.org/xsd/kmodule">
    <kbase name="rules">
        <ksession name="all-rules"/>
    </kbase>
</kmodule>

4.编写Test测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class DroolsApplicationTests {

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


    @Test
    public void contextLoads() {
        KieServices services = KieServices.Factory.get();
        container = services.getKieClasspathContainer();
        statefulKieSession = container.newKieSession("all-rules");
        Person person = new Person();
        person.setAge(15);
        person.setName("Drools");

        statefulKieSession.insert(person);
        statefulKieSession.fireAllRules();
        statefulKieSession.dispose();
    }
}

在这里插入图片描述
5.动态加载规则

@RunWith(SpringRunner.class)
@SpringBootTest
public class DroolsApplicationTests {

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


    @Test
    public void contextLoads() {
        String myRule = "import com.asiainfo.bean.Person\n" +
                "\n" +
                "dialect  \"mvel\"\n" +
                "\n" +
                "rule \"age\"\n" +
                "    when\n" +
                "        $person : Person(age<16 || age>50)\n" +
                "    then\n" +
                "        System.out.println(\"这个人的年龄不符合要求!(基于动态加载)\");\n" +
                "end\n";
        KieHelper helper = new KieHelper();
        helper.addContent(myRule, ResourceType.DRL);
        KieSession ksession = helper.build().newKieSession();
        Person person = new Person();
        person.setAge(12);
        person.setName("Test");
        ksession.insert(person);
        ksession.fireAllRules();
        ksession.dispose();

    }
}

上述测试说明Drools可以基于字符串配置规则,那么我们在开发时就可以将自己配置的规则存到数据库等存储介质中,实时调用动态加载配置规则。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值