宁睿 发表于 2024-7-26 15:01:14

Drools与动态加载规则文件

Drools与动态加载规则文件


[*]Drools简介
[*]

[*]对系统使用人员来说:
[*]对开发人员来说:
[*]Drools架构图
[*]快速开始

 
Drools简介

Drools是一款基于Java的开源规则引擎,将规则与业务代码解耦。规则以脚本的形式存储在一个文件中,使规则的变化不需要修改代码,重新启动机器即可在线上环境中生效。
规则引擎实现了业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入、解释业务规则,以及基于业务规则做出业务决策,从而提供极大的编程便利。
对系统使用人员来说:


[*]将业务规则的创建、修改、维护透明话;
[*]提高业务机动度;
[*]淘汰对开发人员的依赖;
[*]避免业务升级带来的风险
对开发人员来说:


[*]增加代码机动性;
[*]降低系统维护成本,提高系统可维护性;
[*]解耦业务与规则,淘汰代码修改成本;
[*]简化系统架构,优化应用布局;
Drools架构图

https://i-blog.csdnimg.cn/blog_migrate/bdf301fc91850122e785aa678da97c24.png
快速开始

1. Maven导入
<drools.version>7.23.0.Final</drools.version>
<lombok.version>1.18.2</lombok.version>

<dependency>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><groupId>org.kie.server</groupId>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><artifactId>kie-server-client</artifactId>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><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目录,并编写
importcom.mkun.drools.bean.Person;//导入对应bean [?*]
dialect"mvel"

rule "drools-test"
when
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule> $person: Person(age < 16 || age > 50)
then
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule> 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)@SpringBootTestpublic class DroolsApplicationTests {private static KieContainer container = null;private KieSession statefulKieSession = null;@Testpublic void contextLoads() {<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>KieServices services = KieServices.Factory.get();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>container = services.getKieClasspathContainer();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>statefulKieSession = container.newKieSession("all-rules");<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>Person person = new Person();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>person.setAge(15);<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>person.setName("Drools");<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>statefulKieSession.insert(person);<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>statefulKieSession.fireAllRules();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>statefulKieSession.dispose();}} https://i-blog.csdnimg.cn/blog_migrate/286cd01bdfd2169f6b20be6bb55ff72c.png
5.动态加载规则
@RunWith(SpringRunner.class)@SpringBootTestpublic class DroolsApplicationTests {private static KieContainer container = null;private KieSession statefulKieSession = null;@Testpublic void contextLoads() {<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>String myRule = "import com.asiainfo.bean.Person\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>"\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>"dialect\"mvel\"\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>"\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>"rule \"age\"\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>"<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>when\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>"<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>$person : Person(age50)\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>"<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>then\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>"<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>System.out.println(\"这个人的年龄不符合要求!(基于动态加载)\");\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>"end\n";<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>KieHelper helper = new KieHelper();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>helper.addContent(myRule, ResourceType.DRL);<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>KieSession ksession = helper.build().newKieSession();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>Person person = new Person();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>person.setAge(12);<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>person.setName("Test");<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>ksession.insert(person);<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>ksession.fireAllRules();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>ksession.dispose();}} https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png上述测试说明Drools可以基于字符串配置规则,那么我们在开发时就可以将自己配置的规则存到数据库等存储介质中,实时调用动态加载配置规则。
https://i-blog.csdnimg.cn/direct/d3620b85515843e5b7174c23c6622bd4.png
示例demo和相关学习资料会同步上传,需要的同砚移步下。谢谢支持!!!!
添加 回复 “drools-demo” 获取示例代码
https://i-blog.csdnimg.cn/direct/ff2e7f52232b4dc28773987bd8e26b8d.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Drools与动态加载规则文件