springboot 2.x 集成 drools 7.x

简介:springboot 2.0.4.RELEASE 集成 drools 7.11.0.Final

1.项目结构

在这里插入图片描述

2. pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>AllTest</artifactId>
        <groupId>com.lcc</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

<artifactId>drools_springboot</artifactId>

<properties>
<drools.version>7.11.0.Final</drools.version>
<spring.boot.version>2.0.4.RELEASE</spring.boot.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${spring.boot.version}</version>
</dependency>

<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${drools.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.12.6</version>
</dependency>

</dependencies>

</project>

3.配置类

基于springboot的初始化配置:

package com.drools.spring;

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.boot.autoconfigure.condition.ConditionalOnMissingBean;
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;

/**

  • Created by lcc on 2018/9/27.
    */
    @Configuration
    public class DroolsAutoConfiguration {

    /** 特别要注意 rule的存放位置 */
    private static final String RULES_PATH = "rules/";

    @Bean
    @ConditionalOnMissingBean(KieFileSystem.class)
    public KieFileSystem kieFileSystem() throws IOException {
    KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
    for (Resource file : getRuleFiles()) {
    String path = RULES_PATH + file.getFilename();
    kieFileSystem.write(ResourceFactory.newClassPathResource(path, "UTF-8"));
    }
    return kieFileSystem;
    }

    /**

    • 这里要引入 org.springframework.core.io.Resource 包
    • @return
    • @throws IOException
      /
      private Resource[] getRuleFiles() throws IOException {
      ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
      return resourcePatternResolver.getResources("classpath
      :" + RULES_PATH + "**/.");
      }

    @Bean
    @ConditionalOnMissingBean(KieContainer.class)
    public KieContainer kieContainer() throws IOException {
    final KieRepository kieRepository = getKieServices().getRepository();

    kieRepository.addKieModule(new KieModule() {
    public ReleaseId getReleaseId() {
    return kieRepository.getDefaultReleaseId();
    }
    });

    KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());
    kieBuilder.buildAll();

    return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
    }

    private KieServices getKieServices() {
    return KieServices.Factory.get();
    }

    @Bean
    @ConditionalOnMissingBean(KieBase.class)
    public KieBase kieBase() throws IOException {
    return kieContainer().getKieBase();
    }

    @Bean
    @ConditionalOnMissingBean(KieSession.class)
    public KieSession kieSession() throws IOException {
    return kieContainer().newKieSession();
    }

    @Bean
    @ConditionalOnMissingBean(KModuleBeanFactoryPostProcessor.class)
    public KModuleBeanFactoryPostProcessor kiePostProcessor() {
    return new KModuleBeanFactoryPostProcessor();
    }
    }

4.Springboot启动类

package com.drools.spring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**

  • Created by lcc on 2018/9/27.
    */
    @SpringBootApplication
    public class SpringBootDroolsApplication {

    public static void main(String[] args) {
    SpringApplication.run(SpringBootDroolsApplication.class, args);
    }
    }

5.实体类

package com.drools.spring.entity;

import lombok.Data;

/**

  • Created by lcc on 2018/9/27.
    */
    @Data
    public class Address {

    private String postcode;

    private String street;

    private String state;

}

6.规则返回结果类

package com.drools.spring.entity;

import lombok.Data;

/**

  • Created by lcc on 2018/9/27.
    */
    @Data
    public class AddressCheckResult {

    private boolean postCodeResult = false; // true:通过校验;false:未通过校验
    }

7.规则文件

注意存放的位置

package com.rules

import com.drools.spring.entity.Address;
import com.drools.spring.entity.AddressCheckResult;

rule "Postcode should be filled with exactly 5 numbers"

when
address : Address(postcode != null, postcode matches "([0-9]{5})")
checkResult : AddressCheckResult();
then
checkResult.setPostCodeResult(true);
System.out.println("规则中打印日志:校验通过!");
end

8.规则文件kmodule

<?xml version="1.0" encoding="UTF-8" ?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
    <kbase name="rules" packages="com.rules">
        <ksession name="ksession-rule"/>
    </kbase>
</kmodule>

9.测试Controller

package com.drools.spring.controller;

import com.drools.spring.entity.Address;
import com.drools.spring.entity.AddressCheckResult;
import org.kie.api.runtime.KieSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;

/**

  • Created by lcc on 2018/9/27.
    */
    @RequestMapping("/test")
    @Controller
    public class TestController {

    @Resource
    private KieSession kieSession;

    @ResponseBody
    @RequestMapping("/address")
    public void test(){
    Address address = new Address();
    address.setPostcode("99425");

    AddressCheckResult result = new AddressCheckResult();
    kieSession.insert(address);
    kieSession.insert(result);
    int ruleFiredCount = kieSession.fireAllRules();
    System.out.println("触发了" + ruleFiredCount + "条规则");

    if(result.isPostCodeResult()){
    System.out.println("规则校验通过");
    }

    }
    }

启动Springboot项目之后,默认访问http://localhost:8080/test/address 即可。
运行结果

规则中打印日志:校验通过!
触发了1条规则
规则校验通过

posted @ 2019-05-15 16:27  星朝  阅读(6398)  评论(1)    收藏  举报