Drools (一) - 简介

简介

Drools 引擎是 Drools 的规则引擎。Drools 引擎存储,处理和评估数据,以执行您定义的业务规则或决策模型。Drools 引擎的基本功能是将传入的数据或事实与规则条件相匹配,并确定是否以及如何执行规则

样例

1.新建一个 Spring boot 项目

2.引入 maven 库

 <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>7.34.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>7.34.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-templates</artifactId>
            <version>7.34.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>7.34.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-spring</artifactId>
            <version>7.34.0.Final</version>
        </dependency>

3.新建一个配置类如下

import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieRepository;
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.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @author yudong
 * @version 1.0
 * @date 2020/3/23 5:37 下午
 * @modified By
 */
@Component
@Configurable
public class DroolsConfig {

    private final KieServices kieServices = KieServices.Factory.get();

    @Bean
    public KieFileSystem kieFileSystem() throws IOException {
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        Resource[] files = resourcePatternResolver.getResources("classpath*:*.drl");
        for (Resource file : files) {
            kieFileSystem.write(ResourceFactory.newClassPathResource(file.getFilename(), "UTF-8"));
        }
        return kieFileSystem;
    }

    @Bean
    public KieContainer kieContainer( KieFileSystem kieFileSystem) throws IOException {
        KieRepository kieRepository = kieServices.getRepository();
        kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
        KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
        kieBuilder.buildAll();
        return kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
    }


    @Bean
    public KieBase kieBase( KieContainer kieContainer) throws IOException {
        return kieContainer.getKieBase();
    }
    @Bean
    public KieSession kieSession( KieContainer kieContainer) throws IOException {
        return kieContainer.newKieSession();
    }
    @Bean
    public KModuleBeanFactoryPostProcessor kiePostProcessor() {
        return new KModuleBeanFactoryPostProcessor();
    }
}

4.创建两个实体类 QueryParam 和 RuleResult

/**
 * @author yudong
 * @version 1.0
 * @date 2020/3/23 6:15 下午
 * @modified By
 */
public class QueryParam {

    private String test;

    public String getTest() {
        return test;
    }

    public void setTest(String test) {
        this.test = test;
    }
}
/**
 * @author yudong
 * @version 1.0
 * @date 2020/3/23 6:16 下午
 * @modified By
 */
public class RuleResult {

    private Boolean result;

    public Boolean getResult() {
        return result;
    }

    public void setResult(Boolean result) {
        this.result = result;
    }
}

5.在 resources 资源文件夹下创建 test.drl 文件,内容如下

package droolRule ;
import com.example.demo.*
dialect  "java"
rule "test1"
    salience 99
    when queryParam :  QueryParam(test != null)
         resultParam : RuleResult()
    then
        System.out.println("参数内容:"+queryParam.getTest());
        resultParam.setResult(true);
end

6.创建测试 Controller

import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;


/**
 * @author yudong
 * @version 1.0
 * @date 2020/2/11 2:38 下午
 * @modified By
 */
@ResponseBody
@Controller
public class TestController {
    

    @Autowired
    private KieSession kieSession;
    /**
     * 运营后台-登录
     * @return
     * @throws Exception
     */
  @PostMapping("/test")
  public String test()throws Exception{
      QueryParam queryParam = new QueryParam();
      queryParam.setTest("11111");
      RuleResult ruleResult = new RuleResult();
      kieSession.insert(queryParam);
      kieSession.insert(ruleResult);
      kieSession.fireAllRules();
      System.out.println(ruleResult.getResult());
      return "";
   }


}

7.测试结果如下输出

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.9.RELEASE)

2020-03-24 18:15:16.966  INFO 21984 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication on yudongdeMacBook-Pro.local with PID 21984 (/Users/yudong/Documents/Erdos/demo/target/classes started by yudong in /Users/yudong/Documents/Erdos/demo)
2020-03-24 18:15:16.971  INFO 21984 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
2020-03-24 18:15:18.088  INFO 21984 --- [           main] o.k.s.KModuleBeanFactoryPostProcessor    : :: BeanFactoryPostProcessor::postProcessBeanFactory called ::
2020-03-24 18:15:18.098  WARN 21984 --- [           main] o.d.c.k.b.impl.ClasspathKieProject       : Unable to find pom.properties in /Users/yudong/Documents/Erdos/demo/target/classes/com/example/demo
2020-03-24 18:15:18.193  INFO 21984 --- [           main] o.d.c.k.b.impl.ClasspathKieProject       : Recursed up folders, found and used pom.xml /Users/yudong/Documents/Erdos/demo/pom.xml
2020-03-24 18:15:18.195  INFO 21984 --- [           main] o.k.s.KModuleBeanFactoryPostProcessor    : Found project with releaseId: com.example:demo:0.0.1-SNAPSHOT
2020-03-24 18:15:20.204  WARN 21984 --- [           main] io.undertow.websockets.jsr               : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2020-03-24 18:15:20.275  INFO 21984 --- [           main] io.undertow.servlet                      : Initializing Spring embedded WebApplicationContext
2020-03-24 18:15:20.275  INFO 21984 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3238 ms
2020-03-24 18:15:21.411  WARN 21984 --- [           main] o.d.c.kie.builder.impl.KieBuilderImpl    : File 'test.drl' is in folder '' but declares package 'droolRule'. It is advised to have a correspondance between package and folder names.
2020-03-24 18:15:23.238  INFO 21984 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-03-24 18:15:23.615  INFO 21984 --- [           main] com.example.demo.BodyReaderFilter        : filter init
2020-03-24 18:15:23.628  INFO 21984 --- [           main] org.xnio                                 : XNIO version 3.3.8.Final
2020-03-24 18:15:23.646  INFO 21984 --- [           main] org.xnio.nio                             : XNIO NIO Implementation Version 3.3.8.Final
2020-03-24 18:15:23.788  INFO 21984 --- [           main] o.s.b.w.e.u.UndertowServletWebServer     : Undertow started on port(s) 8080 (http) with context path ''
2020-03-24 18:15:23.795  INFO 21984 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 7.442 seconds (JVM running for 9.421)
2020-03-24 18:16:14.257  INFO 21984 --- [  XNIO-1 task-1] io.undertow.servlet                      : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-03-24 18:16:14.257  INFO 21984 --- [  XNIO-1 task-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2020-03-24 18:16:14.274  INFO 21984 --- [  XNIO-1 task-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 17 ms
参数内容:11111
true

回帖
请输入回帖内容...