Drools与动态加载规则文件

宁睿  金牌会员 | 2024-7-26 15:01:14 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 949|帖子 949|积分 2857

Drools与动态加载规则文件

 
Drools简介

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


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


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


快速开始

1. Maven导入
  1.   <drools.version>7.23.0.Final</drools.version>
  2. <lombok.version>1.18.2</lombok.version>
  3. <dependency>
  4. <kmodule xmlns="http://www.drools.org/xsd/kmodule">
  5. <kbase name="rules">
  6.     <ksession name="all-rules"/>
  7. </kbase>
  8. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  9. <kbase name="rules">
  10.     <ksession name="all-rules"/>
  11. </kbase>
  12. </kmodule><groupId>org.kie.server</groupId>
  13. <kmodule xmlns="http://www.drools.org/xsd/kmodule">
  14. <kbase name="rules">
  15.     <ksession name="all-rules"/>
  16. </kbase>
  17. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  18. <kbase name="rules">
  19.     <ksession name="all-rules"/>
  20. </kbase>
  21. </kmodule><artifactId>kie-server-client</artifactId>
  22. <kmodule xmlns="http://www.drools.org/xsd/kmodule">
  23. <kbase name="rules">
  24.     <ksession name="all-rules"/>
  25. </kbase>
  26. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  27. <kbase name="rules">
  28.     <ksession name="all-rules"/>
  29. </kbase>
  30. </kmodule><version>${drools.version}</version>
  31. </dependency>
  32. <dependency>
  33.   <groupId>org.drools</groupId>
  34.   <artifactId>drools-compiler</artifactId>
  35.   <version>${drools.version}</version>
  36. </dependency>
复制代码
 2.Java整合
框架: spring-boot 、Lombok
  1. @Data
  2. public class Person {
  3. private String name;
  4. private int age;
  5. }
复制代码
 3.drl文件的编写,resources下创建rules目录,并编写
  1. import  com.mkun.drools.bean.Person;  //导入对应bean [?*]
  2. dialect  "mvel"
  3. rule "drools-test"
  4. when
  5. <kmodule xmlns="http://www.drools.org/xsd/kmodule">
  6. <kbase name="rules">
  7.     <ksession name="all-rules"/>
  8. </kbase>
  9. </kmodule> $person: Person(age < 16 || age > 50)
  10. then
  11. <kmodule xmlns="http://www.drools.org/xsd/kmodule">
  12. <kbase name="rules">
  13.     <ksession name="all-rules"/>
  14. </kbase>
  15. </kmodule> System.out.println("该人员年龄不符合规则");
  16. end
复制代码
 在对应路径添加Kie文件,resources下创建META-INF文件夹,并且创建文件kmodule.xml
  1. <kmodule xmlns="http://www.drools.org/xsd/kmodule">
  2. <kbase name="rules">
  3.     <ksession name="all-rules"/>
  4. </kbase>
  5. </kmodule>
复制代码
4.编写Test测试
  1. @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">
  2. <kbase name="rules">
  3.     <ksession name="all-rules"/>
  4. </kbase>
  5. </kmodule>KieServices services = KieServices.Factory.get();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  6. <kbase name="rules">
  7.     <ksession name="all-rules"/>
  8. </kbase>
  9. </kmodule>container = services.getKieClasspathContainer();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  10. <kbase name="rules">
  11.     <ksession name="all-rules"/>
  12. </kbase>
  13. </kmodule>statefulKieSession = container.newKieSession("all-rules");<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  14. <kbase name="rules">
  15.     <ksession name="all-rules"/>
  16. </kbase>
  17. </kmodule>Person person = new Person();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  18. <kbase name="rules">
  19.     <ksession name="all-rules"/>
  20. </kbase>
  21. </kmodule>person.setAge(15);<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  22. <kbase name="rules">
  23.     <ksession name="all-rules"/>
  24. </kbase>
  25. </kmodule>person.setName("Drools");<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  26. <kbase name="rules">
  27.     <ksession name="all-rules"/>
  28. </kbase>
  29. </kmodule>statefulKieSession.insert(person);<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  30. <kbase name="rules">
  31.     <ksession name="all-rules"/>
  32. </kbase>
  33. </kmodule>statefulKieSession.fireAllRules();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  34. <kbase name="rules">
  35.     <ksession name="all-rules"/>
  36. </kbase>
  37. </kmodule>statefulKieSession.dispose();}}
复制代码
 

5.动态加载规则
  1. @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">
  2. <kbase name="rules">
  3.     <ksession name="all-rules"/>
  4. </kbase>
  5. </kmodule>String myRule = "import com.asiainfo.bean.Person\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  6. <kbase name="rules">
  7.     <ksession name="all-rules"/>
  8. </kbase>
  9. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  10. <kbase name="rules">
  11.     <ksession name="all-rules"/>
  12. </kbase>
  13. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  14. <kbase name="rules">
  15.     <ksession name="all-rules"/>
  16. </kbase>
  17. </kmodule>"\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  18. <kbase name="rules">
  19.     <ksession name="all-rules"/>
  20. </kbase>
  21. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  22. <kbase name="rules">
  23.     <ksession name="all-rules"/>
  24. </kbase>
  25. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  26. <kbase name="rules">
  27.     <ksession name="all-rules"/>
  28. </kbase>
  29. </kmodule>"dialect  "mvel"\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  30. <kbase name="rules">
  31.     <ksession name="all-rules"/>
  32. </kbase>
  33. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  34. <kbase name="rules">
  35.     <ksession name="all-rules"/>
  36. </kbase>
  37. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  38. <kbase name="rules">
  39.     <ksession name="all-rules"/>
  40. </kbase>
  41. </kmodule>"\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  42. <kbase name="rules">
  43.     <ksession name="all-rules"/>
  44. </kbase>
  45. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  46. <kbase name="rules">
  47.     <ksession name="all-rules"/>
  48. </kbase>
  49. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  50. <kbase name="rules">
  51.     <ksession name="all-rules"/>
  52. </kbase>
  53. </kmodule>"rule "age"\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  54. <kbase name="rules">
  55.     <ksession name="all-rules"/>
  56. </kbase>
  57. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  58. <kbase name="rules">
  59.     <ksession name="all-rules"/>
  60. </kbase>
  61. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  62. <kbase name="rules">
  63.     <ksession name="all-rules"/>
  64. </kbase>
  65. </kmodule>"<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  66. <kbase name="rules">
  67.     <ksession name="all-rules"/>
  68. </kbase>
  69. </kmodule>when\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  70. <kbase name="rules">
  71.     <ksession name="all-rules"/>
  72. </kbase>
  73. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  74. <kbase name="rules">
  75.     <ksession name="all-rules"/>
  76. </kbase>
  77. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  78. <kbase name="rules">
  79.     <ksession name="all-rules"/>
  80. </kbase>
  81. </kmodule>"<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  82. <kbase name="rules">
  83.     <ksession name="all-rules"/>
  84. </kbase>
  85. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  86. <kbase name="rules">
  87.     <ksession name="all-rules"/>
  88. </kbase>
  89. </kmodule>$person : Person(age50)\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  90. <kbase name="rules">
  91.     <ksession name="all-rules"/>
  92. </kbase>
  93. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  94. <kbase name="rules">
  95.     <ksession name="all-rules"/>
  96. </kbase>
  97. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  98. <kbase name="rules">
  99.     <ksession name="all-rules"/>
  100. </kbase>
  101. </kmodule>"<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  102. <kbase name="rules">
  103.     <ksession name="all-rules"/>
  104. </kbase>
  105. </kmodule>then\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  106. <kbase name="rules">
  107.     <ksession name="all-rules"/>
  108. </kbase>
  109. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  110. <kbase name="rules">
  111.     <ksession name="all-rules"/>
  112. </kbase>
  113. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  114. <kbase name="rules">
  115.     <ksession name="all-rules"/>
  116. </kbase>
  117. </kmodule>"<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  118. <kbase name="rules">
  119.     <ksession name="all-rules"/>
  120. </kbase>
  121. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  122. <kbase name="rules">
  123.     <ksession name="all-rules"/>
  124. </kbase>
  125. </kmodule>System.out.println("这个人的年龄不符合要求!(基于动态加载)");\n" +<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  126. <kbase name="rules">
  127.     <ksession name="all-rules"/>
  128. </kbase>
  129. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  130. <kbase name="rules">
  131.     <ksession name="all-rules"/>
  132. </kbase>
  133. </kmodule><kmodule xmlns="http://www.drools.org/xsd/kmodule">
  134. <kbase name="rules">
  135.     <ksession name="all-rules"/>
  136. </kbase>
  137. </kmodule>"end\n";<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  138. <kbase name="rules">
  139.     <ksession name="all-rules"/>
  140. </kbase>
  141. </kmodule>KieHelper helper = new KieHelper();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  142. <kbase name="rules">
  143.     <ksession name="all-rules"/>
  144. </kbase>
  145. </kmodule>helper.addContent(myRule, ResourceType.DRL);<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  146. <kbase name="rules">
  147.     <ksession name="all-rules"/>
  148. </kbase>
  149. </kmodule>KieSession ksession = helper.build().newKieSession();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  150. <kbase name="rules">
  151.     <ksession name="all-rules"/>
  152. </kbase>
  153. </kmodule>Person person = new Person();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  154. <kbase name="rules">
  155.     <ksession name="all-rules"/>
  156. </kbase>
  157. </kmodule>person.setAge(12);<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  158. <kbase name="rules">
  159.     <ksession name="all-rules"/>
  160. </kbase>
  161. </kmodule>person.setName("Test");<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  162. <kbase name="rules">
  163.     <ksession name="all-rules"/>
  164. </kbase>
  165. </kmodule>ksession.insert(person);<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  166. <kbase name="rules">
  167.     <ksession name="all-rules"/>
  168. </kbase>
  169. </kmodule>ksession.fireAllRules();<kmodule xmlns="http://www.drools.org/xsd/kmodule">
  170. <kbase name="rules">
  171.     <ksession name="all-rules"/>
  172. </kbase>
  173. </kmodule>ksession.dispose();}}
复制代码
 
上述测试说明Drools可以基于字符串配置规则,那么我们在开发时就可以将自己配置的规则存到数据库等存储介质中,实时调用动态加载配置规则。

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表