直接上代碼:
第一步,maven引入相關包
<?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"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <drools.version>6.1.0.Final</drools.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-spring</artifactId> <version>${drools.version}</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>${drools.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
第二步,編寫一個規則文件:
//包名 package test import com.example.demo.drools.test.Stu; //rule 就是三大塊中的規則體,以rule開頭,以end 結尾,每個規則文件可以包含多個rule。規則體分爲三個部分,LHS RHS 屬性 三大部分 //LHS:條件部分又被稱之爲 LeftHand Side,簡稱爲 LHS,在一個規則當中 when 與 then 中間的部分就是 LHS 部分。 //在 LHS 當中,可以包含 0~n 個條件,如果 LHS 部分沒空的話,那麼引擎會自動添加一個eval(true)的條件,由於該條件總是返回 true,所以 LHS 爲空的規則總是返回 true。 //RHS:結果部分又被稱之爲 RightHand Side,簡稱爲 RHS,在一個規則當中 then後面部分就是 RHS,只有在 LHS 的所有條件都滿足時 RHS 部分纔會執行。 rule "rule1" salience 1 when $stu:Stu(age>30)//這裏就是LHS then System.out.println("age>30歲的人:"+$stu.getName());//RHS end rule "rule2" salience 2 when $stu:Stu(gender=="male",age>25) then System.out.println("性別爲男,age>25歲的人:"+$stu.getName()); end rule "rule3" salience 3 when $stu:Stu(getName()=="張三") then System.out.println("名字爲:"+$stu.getName()); end
第三步:測試代碼
package com.example.demo.drools.test; import org.drools.core.io.impl.ClassPathResource; import org.kie.api.io.ResourceType; import org.kie.internal.KnowledgeBase; import org.kie.internal.KnowledgeBaseFactory; import org.kie.internal.builder.KnowledgeBuilder; import org.kie.internal.builder.KnowledgeBuilderFactory; import org.kie.internal.definition.KnowledgePackage; import org.kie.internal.runtime.StatefulKnowledgeSession; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * Created by ming on 2018/5/24. */ public class Test { public static void main(String[] args) { KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder(); kb.add(new ClassPathResource("test.drl"), ResourceType.DRL); Collection<KnowledgePackage> collection = kb.getKnowledgePackages(); KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase(); knowledgeBase.addKnowledgePackages(collection); StatefulKnowledgeSession statefulSession = knowledgeBase.newStatefulKnowledgeSession(); List<Stu> list = getStus(); for (Stu stu : list) { statefulSession.insert(stu); } statefulSession.fireAllRules(); statefulSession.dispose(); System.out.println("end...."); } public static List<Stu> getStus() { List<Stu> stus = new ArrayList<>(); stus.add(new Stu("張三", 16, "male")); stus.add(new Stu("huhu", 18, "male")); stus.add(new Stu("王五", 32, "male")); stus.add(new Stu("張紅", 23, "female")); stus.add(new Stu("李四", 35, "male")); stus.add(new Stu("張小雅", 31, "female")); return stus; } }
package com.example.demo.drools.test; /** * Created by Administrator on 2018/5/24. */ public class Stu { private String name; private int age; private String gender; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Stu(String name,int age,String gender){ this.name=name; this.age=age; this.gender=gender; } }
然後看見規則文件生效了....