目录
│ .gitignore
│ pom.xml
│ README.md
│
├─.idea
│ workspace.xml
│
├─src
│ ├─main
│ │ ├─java
│ │ │ └─cn
│ │ │ └─org
│ │ │ └─zhixiang
│ │ │ │ DroolsApplication.java
│ │ │ │
│ │ │ ├─config
│ │ │ │ DroolsAutoConfiguration.java
│ │ │ │
│ │ │ └─entity
│ │ │ BookInfo.java
│ │ │ Dog.java
│ │ │ User.java
│ │ │
│ │ └─resources
│ │ │ application.yml
│ │ │
│ │ └─rules
│ │ Function.drl
│ │ HelloWord.drl
│ │ Property.drl
│ │
│ └─test
│ └─java
│ └─cn
│ └─org
│ └─zhixiang
│ BlogsUrlOutputTest.java
│ DroolsApplicationFunctionTests.java
│ DroolsApplicationHelloWordTests.java
│ DroolsApplicationKieServerTest.java
│ DroolsApplicationPropertyTests.java
│ DroolsApplicationWorkBenchTests.java
│
└─target
├─classes
│ │ application.yml
│ │
│ ├─cn
│ │ └─org
│ │ └─zhixiang
│ │ │ DroolsApplication.class
│ │ │
│ │ ├─config
│ │ │ DroolsAutoConfiguration$1.class
│ │ │ DroolsAutoConfiguration.class
│ │ │
│ │ └─entity
│ │ BookInfo.class
│ │ Dog.class
│ │ User.class
│ │
│ └─rules
│ Function.drl
│ HelloWord.drl
│ Property.drl
│
├─generated-sources
│ └─annotations
├─generated-test-sources
│ └─test-annotations
└─test-classes
└─cn
└─org
└─zhixiang
BlogsUrlOutputTest.class
DroolsApplicationFunctionTests.class
DroolsApplicationHelloWordTests.class
DroolsApplicationKieServerTest.class
DroolsApplicationPropertyTests.class
DroolsApplicationWorkBenchTests.class
工程配置文件
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">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.org.zhixiang</groupId>
<artifactId>drools</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>drools</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</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>7.14.0.Final</drools.version>
</properties>
<repositories>
<repository>
<id>guvnor-m2-repo</id>
<name>Guvnor M2 Repo</name>
<!--<url>http://localhost:8080/kie-drools/maven2/</url>-->
<url>http://118.25.197.252:8080/drools-wb/maven2/</url>
</repository>
<repository>
<id>Central-Repository</id>
<name>Central Repository</name>
<!--<url>http://localhost:8080/kie-drools/maven2/</url>-->
<url> https://repo1.maven.org/maven2/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jdt</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
<version>3.15.0</version>
</dependency>
<!-- kieServer依赖-->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>7.14.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.14.0.Final</version>
</dependency>
<dependency>
<groupId>org.kie.server</groupId>
<artifactId>kie-server</artifactId>
<version>7.14.0.Final</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<dependency>
<groupId>com.qchery</groupId>
<artifactId>harper</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version><!--$NO-MVN-MAN-VER$-->
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.yml:
server:
port: 8081
Function.drl:
package rules;
import cn.org.zhixiang.entity.User
rule "test1"
when
then
insert(new User("赵六",12));
System.err.println("创造赵六");
end
rule "test2"
when
$u:User(name=="赵六")
then
$u.setName("王五");
update($u);
System.err.println("赵六");
end
rule "test3"
when
$u:User(name=="王五")
then
System.err.println("王五");
retract($u);
end
rule "test4"
when
$u:User(name=="王五")
then
System.err.println("王五删除删除之后"+$u.getName());
end
HelloWord.drl
package rules;
import cn.org.zhixiang.entity.User;
import java.lang.String;
import java.util.List;
rule "hello,word"
when
eval(true)
then
System.err.println("hello,word!");
end
rule "user"
when
$u:User(name=="张三",age==18)//连接符: && || ,
then
$u.setName("李四");
System.err.println("hello,word:"+$u.getName());
end
rule "contains"
when
$s:String()
$u:User(name contains $s)
then
System.err.println("用户张三存在");
end
rule "memberOf"
when
$list:List()
$u:User(name memberOf $list)
then
System.err.println("用户李四存在");
end
rule "matches"
when
$u:User(name matches "张.*")
then
System.err.println("用户张xx存在");
end
Property.drl
package rules;
import cn.org.zhixiang.entity.User;
rule "salience2"
salience 2
when
eval(true)
then
System.err.println("salience2");
end
rule "salience1"
salience 1
when
eval(true)
then
System.err.println("salience1");
end
rule "dateEffective"
date-effective "2018-11-24"
when
then
System.err.println("2018-11-24被执行");
end
rule "dateEffectiveTomorrow"
date-effective "2018-11-25"
when
then
System.err.println("2018-11-25被执行");
end
rule "enabled"
enabled false
when
then
System.err.println("被禁用的规则");
end
测试代码
BlogsUrlOutputTest
package cn.org.zhixiang;
import cn.org.zhixiang.entity.BookInfo;
import org.junit.Test;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class BlogsUrlOutputTest {
private static List<BookInfo> books;
static{
books=new ArrayList<>();
books.add(new BookInfo(0,"weixin_40078053","79869321"));
books.add(new BookInfo(1,"free-wings","10281198.html"));
books.add(new BookInfo(0,"X5fnncxzq4","82919860"));
books.add(new BookInfo(1,"loveyou","cuckoo.html"));
books.add(new BookInfo(1,"loveyou","cuckoo.html"));
}
@Test
public void testRule2() throws Exception {
genUrlText();
}
private void genUrlText() throws IOException {
BufferedReader buf=new BufferedReader(new FileReader(new File("D://example.txt")));
String line = null;
books=new ArrayList<>();
while((line = buf.readLine()) != null) {
String[] meta=line.split(" ");
books.add(new BookInfo(Integer.valueOf(meta[0]),meta[1],meta[2]));
}
File f=new File("D://books.txt");
f.delete();
f.createNewFile();
FileWriter w=new FileWriter(new File("D://books.txt"),true);
for(BookInfo b:books){
String bookUrl="";
if(b.getType()==0){
bookUrl="https://blog.youkuaiyun.com/"+b.getAuthorName()+"/article/details/"+b.getSuffix();
}else{
bookUrl="https://www.cnblogs.com/"+b.getAuthorName()+"/p/"+b.getSuffix();
}
w.write(bookUrl);
w.write("\r\n");
}
w.flush();
w.close();
}
}
DroolsApplicationFunctionTests
package cn.org.zhixiang;
import org.drools.core.base.RuleNameEndsWithAgendaFilter;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class DroolsApplicationFunctionTests {
@Autowired
KieSession kieSession;
@Test
public void testFunction() {
kieSession.fireAllRules();
}
}
DroolsApplicationHelloWordTests
package cn.org.zhixiang;
import cn.org.zhixiang.entity.User;
import org.drools.core.base.RuleNameEndsWithAgendaFilter;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class DroolsApplicationHelloWordTests {
@Autowired
KieSession kieSession;
@Test
public void testHelloWord() {
kieSession.fireAllRules();
}
@Test
public void testUser() {
User user=new User("张三",18);
kieSession.insert(user);
kieSession.fireAllRules();
System.err.println("规则执行完毕后张三变为了:"+user.getName());
}
@Test
public void testOneRule() {
User user=new User("张三",18);
kieSession.insert(user);
kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("user"));
}
@Test
public void testContains() {
String name="张三";
User user=new User("张三",18);
kieSession.insert(name);
kieSession.insert(user);
kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("contains"));
}
@Test
public void testMemberOf() {
List list=new ArrayList();
list.add("张三");
list.add("李四");
User user=new User("李四",18);
kieSession.insert(list);
kieSession.insert(user);
kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("memberOf"));
}
@Test
public void testMatches() {
User user=new User("张三",18);
kieSession.insert(user);
kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("matches"));
}
}
testKieServer
package cn.org.zhixiang;
import com.alibaba.fastjson.JSONObject;
import com.qchery.harper.fact.Address;
import com.qchery.harper.fact.ApplyInfo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.api.KieServices;
import org.kie.api.command.Command;
import org.kie.api.command.KieCommands;
import org.kie.api.runtime.ExecutionResults;
import org.kie.server.api.marshalling.MarshallingFormat;
import org.kie.server.api.model.ServiceResponse;
import org.kie.server.client.KieServicesClient;
import org.kie.server.client.KieServicesConfiguration;
import org.kie.server.client.KieServicesFactory;
import org.kie.server.client.RuleServicesClient;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.LinkedList;
import java.util.List;
@RunWith(SpringRunner.class)
public class DroolsApplicationKieServerTest {
public static final String SERVER_URL = "http://118.25.197.252:8180/kie-server/services/rest/server";
public static final String PASSWORD = "kieserver1!";
public static final String USERNAME = "kieserver";
public static final String KIE_CONTAINER_ID = "com.qchery:harper:1.0.0";//"kie-server-80835beb889a";
@Test
public void testKieServer() {
// KisService 配置信息设置
KieServicesConfiguration kieServicesConfiguration =
KieServicesFactory.newRestConfiguration(SERVER_URL, USERNAME, PASSWORD, 10000L);
kieServicesConfiguration.setMarshallingFormat(MarshallingFormat.JSON);
// 创建规则服务客户端
KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(kieServicesConfiguration);
RuleServicesClient ruleServicesClient = kieServicesClient.getServicesClient(RuleServicesClient.class);
// 规则输入条件
ApplyInfo applyInfo = new ApplyInfo();
applyInfo.setAge(19);
Address familyAddress = new Address();
familyAddress.setProvince("aa");
applyInfo.setFamilyAddress(familyAddress);
// 命令定义,包含插入数据,执行规则
KieCommands kieCommands = KieServices.Factory.get().getCommands();
List<Command<?>> commands = new LinkedList<>();
commands.add(kieCommands.newInsert(applyInfo, "applyInfo"));
commands.add(kieCommands.newFireAllRules());
String payload="{\"lookup\": \"ksessionId1\", \"commands\": [{ \"insert\": { \"return-object\": true, \"out-identifier\": \"applyInfo\", \"object\": { \"com.qchery.harper.fact.ApplyInfo\": { \"name\": null, \"age\": 19, \"familyAddress\": { \"city\": null, \"detail\": null, \"distract\": null, \"province\": \"aa\" } } } } }, { \"fire-all-rules\": \"\" }] }";
System.err.println(payload);
System.err.println(JSONObject.toJSON(kieCommands.newBatchExecution(commands, "ksessionId1")).toString());
ServiceResponse<ExecutionResults> results = ruleServicesClient.executeCommandsWithResults(KIE_CONTAINER_ID,
/*kieCommands.newBatchExecution(commands, "ksessionId1")*/payload);
// 返回值读取
ApplyInfo value = (ApplyInfo) results.getResult().getValue("applyInfo");
System.out.println(JSONObject.toJSON(value).toString());
}
}
DroolsApplicationPropertyTests
package cn.org.zhixiang;
import org.drools.core.base.RuleNameEndsWithAgendaFilter;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class DroolsApplicationPropertyTests {
@Autowired
KieSession kieSession;
@Test
public void testSalience() {
kieSession.fireAllRules();
}
@Test
public void testDateEffective() {
kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("dateEffective"));
}
@Test
public void testDateEffectiveTomorrow() {
kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("dateEffectiveTomorrow"));
}
@Test
public void testEnabled() {
kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("enabled"));
}
}
DroolsApplicationWorkBenchTests
package cn.org.zhixiang;
import cn.org.zhixiang.entity.Dog;
import org.drools.compiler.kproject.ReleaseIdImpl;
import org.drools.core.io.impl.UrlResource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.api.KieServices;
import org.kie.api.builder.KieModule;
import org.kie.api.builder.KieRepository;
import org.kie.api.builder.KieScanner;
import org.kie.api.builder.ReleaseId;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.io.InputStream;
@RunWith(SpringRunner.class)
public class DroolsApplicationWorkBenchTests {
@Test
public void testWorkbench() {
String url = "http://118.25.197.252:8080/drools-wb/maven2/cn/org/zhixiang/drools-test1/0.0.1/drools-test1-0.0.1.jar";
KieServices kieServices = KieServices.Factory.get();
KieRepository kieRepository = kieServices.getRepository();
UrlResource resource = (UrlResource) kieServices.getResources().newUrlResource(url);
resource.setBasicAuthentication("enabled");
resource.setPassword("admin");
resource.setUsername("admin");
InputStream is = null;
try {
is = resource.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
KieModule kieModule = kieRepository.addKieModule(kieServices.getResources().newInputStreamResource(is));
KieContainer kieContainer = kieServices.newKieContainer(kieModule.getReleaseId());
KieSession kieSession = kieContainer.newKieSession();
Dog dog = new Dog();
dog.setName("大黄");
kieSession.insert(dog);
kieSession.fireAllRules();
}
}
源码
DroolsApplication.java
package cn.org.zhixiang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DroolsApplication {
public static void main(String[] args) {
SpringApplication.run(DroolsApplication.class, args);
}
}
DroolsAutoConfiguration.java
package cn.org.zhixiang.config;
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;
/**
* d
*
* @author syj
* CreateTime 2018/11/23
* describe:
*/
@Configuration
public class DroolsAutoConfiguration {
private static final String RULES_PATH = "rules/";
@Bean
@ConditionalOnMissingBean(KieFileSystem.class)
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
for (Resource file : getRuleFiles()) {
kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8"));
}
return kieFileSystem;
}
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());
}
@Bean
@ConditionalOnMissingBean(KieBase.class)
public KieBase kieBase() throws IOException {
return kieContainer().getKieBase();
}
@Bean
@ConditionalOnMissingBean(KieSession.class)
public KieSession kieSession() throws IOException {
KieSession kieSession = kieContainer().newKieSession();
return kieSession;
}
@Bean
@ConditionalOnMissingBean(KModuleBeanFactoryPostProcessor.class)
public KModuleBeanFactoryPostProcessor kiePostProcessor() {
return new KModuleBeanFactoryPostProcessor();
}
public KieServices getKieServices() {
System.setProperty("drools.dateformat","yyyy-MM-dd");
return KieServices.Factory.get();
}
}
BookInfo.java
package cn.org.zhixiang.entity;
public class BookInfo {
private int type;//0;csdn; 1:cnblogs
private String authorName;
private String suffix;
public BookInfo(int type, String authorName, String suffix) {
this.type = type;
this.authorName = authorName;
this.suffix = suffix;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getAuthorName() {
return authorName;
}
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
}
Dog.java
package cn.org.zhixiang.entity;
/**
* d
*
* @author syj
* CreateTime 2018/11/26
* describe:
*/
public class Dog {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
User.java
package cn.org.zhixiang.entity;
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}