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可以基于字符串配置规则,那么我们在开发时就可以将自己配置的规则存到数据库等存储介质中,实时调用动态加载配置规则。

示例demo和相关学习资料会同步上传,需要的同学移步下。谢谢支持!!!!
添加 回复 “drools-demo” 获取示例代码

热门相关:与你相恋的小时光   战国明月   极品仙师   呆萌小青梅:妖孽竹马太腹黑   我的全世界就是你