• Spring Boot+Drools规则引擎整合


    目的

    官方的Drools范例大都是基于纯Java项目或Maven项目,而基于Spring Boot项目的很少。

    本文介绍如何在Spring Boot项目上加上Drools规则引擎。

    POM依赖

    POM文件如下:

    <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">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.galaxyyao</groupId>
        <artifactId>springbootdroolstest1</artifactId>
        <version>1.0.0</version>
        <packaging>jar</packaging>
    
        <name>springbootdroolstest1</name>
        <url>http://maven.apache.org</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.2.RELEASE</version>
        </parent>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.drools</groupId>
                <artifactId>drools-core</artifactId>
                <version>7.0.0.Final</version>
            </dependency>
            <dependency>
                <groupId>org.drools</groupId>
                <artifactId>drools-compiler</artifactId>
                <version>7.0.0.Final</version>
            </dependency>
            <dependency>
                <groupId>org.drools</groupId>
                <artifactId>drools-decisiontables</artifactId>
                <version>7.0.0.Final</version>
            </dependency>
            <dependency>
                <groupId>org.drools</groupId>
                <artifactId>drools-templates</artifactId>
                <version>7.0.0.Final</version>
            </dependency>
    
            <dependency>
                <groupId>org.kie</groupId>
                <artifactId>kie-api</artifactId>
                <version>7.0.0.Final</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <configuration>
                        <executable>java</executable>
                        <arguments>
                            <argument>com.galaxyyao.springbootdroolstest1.SpringBootDroolsTest1Application</argument>
                        </arguments>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>

    其中比较需要注意的是使用了exec-maven-plugin插件,不然无法启动

    引用的Drools包的版本可以自行调整。

    Resources

    在src/main/resources下添加两个目录:

    META-INF和rules

    META-INF下添加kmodule.xml,内容如下:

    <kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
       <kbase name="rules" packages="rules">
           <ksession name="ksession-rules"/>
       </kbase>
    </kmodule>

    rules目录下添加一个简单的Hello World规则

    package com.galaxyyao.springbootdroolstest1
    import com.galaxyyao.springbootdroolstest1.domain.Message
    dialect  "mvel"
    
    rule "Hello World"
        dialect "mvel"
        when
            m : Message(status.equals(Message.HELLO), message : message )
        then
            System.out.println( message);
        modify ( m ) { message = "Goodbye cruel world",status = Message.GOODBYE };
    end
    
    rule "Good Bye"
        dialect "java"
        when
           Message( status == Message.GOODBYE, message : message )
        then
            System.out.println( message );
    end

    Domain层

    Domain层定义一个Drools中需要使用到的Model:

    package com.galaxyyao.springbootdroolstest1.domain;
    
    public class Message {
       public static final Integer HELLO = 0;
       public static final Integer GOODBYE = 1;
    
       private String message;
    
       private Integer status;
    
       public String getMessage() {
           return this.message;
       }
    
       public void setMessage(String message) {
           this.message = message;
       }
    
       public Integer getStatus() {
           return this.status;
       }
    
       public void setStatus(Integer status) {
           this.status = status;
       }
    }
     

    Service层

    Service层负责实际运行规则:

    package com.galaxyyao.springbootdroolstest1.service;
    
    import org.kie.api.KieServices;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.KieSession;
    import org.springframework.stereotype.Service;
    
    import com.galaxyyao.springbootdroolstest1.domain.Message;
    
    @Service
    public class DroolsService {
     public String fireRule() {
     // load up the knowledge base
            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            KieSession kSession = kContainer.newKieSession("ksession-rules");
    
           // go !
            Message message = new Message();
            message.setMessage("Hello World");
            message.setStatus(Message.HELLO);
            kSession.insert(message);//插入
            kSession.fireAllRules();//执行规则
            kSession.dispose();
           return message.getMessage();
     }
    }
  • 相关阅读:
    我为何需要使用空接口?
    Castle 整合.NET Remoting
    MVC结构简介
    在asp.net页面上得到Castle容器的实例
    Castle.MVC框架介绍
    08.vue-router动态路由匹配
    07. vue-router嵌套路由
    06.路由重定向
    04 Vue Router路由管理器
    ES6新特性之 let 、const
  • 原文地址:https://www.cnblogs.com/galaxyyao/p/7119930.html
Copyright © 2020-2023  润新知