1. 程式人生 > >Spring Boot+Drools規則引擎整合

Spring Boot+Drools規則引擎整合

ood pid message star 定義 比較 java sch 4.0

目的

官方的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();
 }
}

Spring Boot+Drools規則引擎整合