Springboot + Drools入门

短命女 2022-01-27 17:41 333阅读 0赞

文章目录

  • 0.搭建项目流程图
  • 1.项目结构
  • 2.pom.xml文件
  • 3.配置类
  • 4.实体类
  • 5.控制器层
  • 6.规则文件
      • 该项目代码下载地址:

这段时间需要用到“ ** 规则引擎 ** ”,在对比了很多开源工具后,选择了Drools。目前正在进行入门学习,感觉drools的使用还是非常方便的。
对于drools的优点、作用和具体的使用教程还请自行查阅资料,这里仅仅使用使用springboot+drools搭建一个小demo.

0.搭建项目流程图

在这里插入图片描述

1.项目结构

在这里插入图片描述

2.pom.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <parent>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-starter-parent</artifactId>
  7. <version>2.1.5.RELEASE</version>
  8. <relativePath/> <!-- lookup parent from repository -->
  9. </parent>
  10. <groupId>com.wllfengshu</groupId>
  11. <artifactId>drools</artifactId>
  12. <version>0.0.1-SNAPSHOT</version>
  13. <name>drools</name>
  14. <description>Demo project for Spring Boot</description>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. <drools.version>7.11.0.Final</drools.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.projectlombok</groupId>
  26. <artifactId>lombok</artifactId>
  27. <optional>true</optional>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.kie</groupId>
  36. <artifactId>kie-api</artifactId>
  37. <version>${drools.version}</version>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.kie</groupId>
  41. <artifactId>kie-spring</artifactId>
  42. <version>${drools.version}</version>
  43. <exclusions>
  44. <exclusion>
  45. <groupId>org.springframework</groupId>
  46. <artifactId>spring-tx</artifactId>
  47. </exclusion>
  48. <exclusion>
  49. <groupId>org.springframework</groupId>
  50. <artifactId>spring-beans</artifactId>
  51. </exclusion>
  52. <exclusion>
  53. <groupId>org.springframework</groupId>
  54. <artifactId>spring-core</artifactId>
  55. </exclusion>
  56. <exclusion>
  57. <groupId>org.springframework</groupId>
  58. <artifactId>spring-context</artifactId>
  59. </exclusion>
  60. </exclusions>
  61. </dependency>
  62. <dependency>
  63. <groupId>org.drools</groupId>
  64. <artifactId>drools-compiler</artifactId>
  65. <version>${drools.version}</version>
  66. </dependency>
  67. </dependencies>
  68. <build>
  69. <plugins>
  70. <plugin>
  71. <groupId>org.springframework.boot</groupId>
  72. <artifactId>spring-boot-maven-plugin</artifactId>
  73. </plugin>
  74. <plugin>
  75. <groupId>org.apache.maven.plugins</groupId>
  76. <artifactId>maven-compiler-plugin</artifactId>
  77. <configuration>
  78. <source>1.8</source>
  79. <target>1.8</target>
  80. </configuration>
  81. </plugin>
  82. <plugin>
  83. <groupId>org.apache.maven.plugins</groupId>
  84. <artifactId>maven-jar-plugin</artifactId>
  85. <configuration>
  86. <archive>
  87. <manifest>
  88. <addClasspath>true</addClasspath>
  89. <useUniqueVersions>false</useUniqueVersions>
  90. <classpathPrefix>lib/</classpathPrefix>
  91. <mainClass>com.wllfengshu.drools.DroolsApplication</mainClass>
  92. </manifest>
  93. </archive>
  94. </configuration>
  95. </plugin>
  96. </plugins>
  97. </build>
  98. </project>

3.配置类

  • 这里稍微做了优化

    package com.wllfengshu.drools.configs;

    import org.kie.api.KieBase;
    import org.kie.api.KieServices;
    import org.kie.api.builder.*;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.KieSession;
    import org.kie.internal.io.ResourceFactory;
    import org.kie.spring.KModuleBeanFactoryPostProcessor;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.Resource;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.core.io.support.ResourcePatternResolver;

    import java.io.IOException;

    /* @author wangll */
    @Configuration
    public class DroolsConfig {

    1. /** * rule文件的存放位置 */
    2. private static final String RULES_PATH = "rules/";
    3. /** * 获取到的KieServices其实是一个单例 */
    4. private final KieServices kieServices = KieServices.Factory.get();
    5. @Bean
    6. public KieFileSystem kieFileSystem() throws IOException {
    7. KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
    8. ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
    9. Resource[] files = resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");
    10. String path = null;
    11. for (Resource file : files) {
    12. path = RULES_PATH + file.getFilename();
    13. kieFileSystem.write(ResourceFactory.newClassPathResource(path, "UTF-8"));
    14. }
    15. return kieFileSystem;
    16. }
    17. @Bean
    18. public KieContainer kieContainer() throws IOException {
    19. KieRepository kieRepository = kieServices.getRepository();
    20. kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
    21. KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem());
    22. kieBuilder.buildAll();
    23. return kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
    24. }
    25. @Bean
    26. public KieBase kieBase() throws IOException {
    27. return kieContainer().getKieBase();
    28. }
    29. @Bean
    30. public KieSession kieSession() throws IOException {
    31. return kieContainer().newKieSession();
    32. }
    33. @Bean
    34. public KModuleBeanFactoryPostProcessor kiePostProcessor() {
    35. return new KModuleBeanFactoryPostProcessor();
    36. }

    }

4.实体类

  1. package com.wllfengshu.drools.model;
  2. import lombok.Data;
  3. /** * @author wangll */
  4. @Data
  5. public class Address {
  6. private String postcode;
  7. private String street;
  8. private String state;
  9. }

5.控制器层

  1. package com.wllfengshu.drools.rest;
  2. import com.wllfengshu.drools.model.Address;
  3. import org.kie.api.runtime.KieSession;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.*;
  6. /** * @author wangll */
  7. @RestController
  8. @RequestMapping("/test")
  9. public class TestController {
  10. @Autowired
  11. private KieSession kieSession;
  12. @ResponseBody
  13. @RequestMapping(value = "/address/{postCode}",method = RequestMethod.GET)
  14. public void test(@PathVariable(value = "postCode") String postCode){
  15. // 以下的数据可以从数据库来,这里写死了
  16. Address address = new Address();
  17. address.setPostcode(postCode);
  18. // 使用规则引擎
  19. kieSession.insert(address);
  20. int ruleFiredCount = kieSession.fireAllRules();
  21. System.out.println("触发了" + ruleFiredCount + "条规则");
  22. System.out.println("---------------------------------");
  23. }
  24. }

6.规则文件

  • 这个规则是检查“地址”中“邮编”是否是5个字符以内的数字

    package com.rules

    import com.wllfengshu.drools.model.Address;

    rule “Postcode should be filled with exactly 5 numbers”

    1. when
    2. $address : Address(postcode != null, postcode matches "([0-9]{5})")
    3. then
    4. System.out.println("规则中打印日志:校验通过!");

    end

该项目代码下载地址:

https://download.csdn.net/download/tiandixuanwuliang/11215152

(ps:这个csdn的积分取消不掉,后期我会在github上做一个开源项目。包括Drools小Demo,同时也准备做一个界面拖拽生成规则的开源项目。欢迎大家关注,谢谢)

参考:https://blog.csdn.net/qq\_21383435/article/details/82873711
在上述参考文献中做了如下修改:
1、去掉了spring-boot-autoconfigure依赖
2、去掉了kmodule.xml配置文件
3、修改controller层中的Resource为Autowired注解
4、优化部分代码

发表评论

表情:
评论列表 (有 0 条评论,333人围观)

还没有评论,来说两句吧...

相关阅读

    相关 springboot-drools7(2)

    KieServices 该接口提供了很多方法,可以通过这些方法构建和运行KIE相关对象,比如说可以获取KieContainer,利用KieContainer来访问KBas