很早之前研究的规则应擎拿出来总结一下。
<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.fei.drools</groupId>
<artifactId>drools-test2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>6.4.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>6.4.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>knowledge-api</artifactId>
<version>6.4.0.Final</version>
</dependency>
</dependencies>
</project>
package com.cpic.caf.template.home.drools.vo;
public class Message {
public static final int HELLO = 0;
public static final int GOODBYE = 1;
@org.kie.api.definition.type.Label("消息")
private String msg = "test";
private int status;
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Message() {
super();
}
public String getMsg() {
return this.msg;
}
public void setMsg(String message) {
this.msg = message;
}
public int getStatus() {
return this.status;
}
public void setStatus(int status) {
this.status = status;
}
}
package drools;
import java.io.UnsupportedEncodingException;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import com.cpic.caf.template.home.drools.vo.Message;
/**
* @author 作者 :lyj
* @version 创建时间:2018年6月22日 下午6:26:02
* 压测规则引擎
*/
public class TestDroolsDemo {
public static void main(String[] args) {
//定义规则
String value = "value1!=null && value1!=\"\":\"DESC\"";
//是否包含":"字符
if(value.indexOf(":")!=-1){
System.out.println("包含");
}else{
System.out.println("不包含");
}
//对字符":"进行切割
String[] str = value.split(":");
//去切割前的值
System.out.println(str[0]);
//取切割后的值
System.out.println(str[1]);
for(String s:str){
System.out.println(s);
}
/**
*有状态的知识转换是与引擎交互的最常见方式。一个StatefulKnowledgeSession
*允许应用程序与引擎建立迭代对话,其中的状态为
*会话在调用之间保持。推理过程可能被多次触发
*相同的数据集。但是,在应用程序使用会话完成之后,它必须<b>必须</b>调用
* <code>dispose()</code>方法,释放资源和使用的内存。
*/
StatefulKnowledgeSession kSession = null;
try {
/**
* KnowledgeBuilder负责获取源文件,如.drl文件、.bpmn2文件或.xls文件,
* 并将其转化为知识库中的规则和过程定义知识包
* 可以使用。它使用ResourceType enum告诉它要构建的资源的类型。
*
* KnowledgeBuilderConfiguration由这个工厂创造。允许您设置要使用的类加载程序
* 以及其他设置,如默认方言和编译器,以及许多其他选项。
* 知识建造商=知识建造商。新知识建造商();
*
* newKnowledgeBuilder使用默认的knowledgebuilderconfiguration
* 创建并返回一个新的KnowledgeBuilder
* 知识建造商=知识建造商。新知识建造商;
*/
KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();
//定义循环测试效率
for (int i = 0; i < 10; i++) {
//定义一个带有多个参数的规则此规则可以存到数据库拿出
String value2 = "value1!=null && value1!=\"\":\"DESC\"";
//使用StringBuilder拼接减少拼接时间
StringBuilder rule = new StringBuilder();
rule.append(
//package rule 规则名字
"package rules\r\n")
//javabean所对应的包名
.append("import com.cpic.caf.template.home.drools.vo.Message;\r\n")
.append("rule \"rule"+i+"\"\r\n")
.append("\twhen\r\n")
.append("m:Message( status == " + i
+ ", myMessage : msg );")
.append("\tthen\r\n")
.append("\t\tSystem.out.println( \"清洗数据\"+\":\"+myMessage );\r\n");
//有分割符就进行分割拼接
if(value2.indexOf(":")!=-1){
rule.append("\t\tm.setMsg(");
String[] segmentationdsPropRule = value2.split(":");
rule.append(segmentationdsPropRule[1]).append(");\r\n");
}
rule.append("\t\tm.setMessage(\"success\");\r\n")
.append("end\r\n");
// 装入规则,可以装入多个
/**
* 可以启动的服务,以提供已更改资源的通知。
*/
kb.add(ResourceFactory.newByteArrayResource(rule.toString()
.getBytes("utf-8")), ResourceType.DRL);
}
//错误的类型化集合。
KnowledgeBuilderErrors errors = kb.getErrors();
for (KnowledgeBuilderError error : errors) {
System.out.println(error);
}
/**
* KnowledgeBase 知识库kbase = KnowledgeBaseFactory.newKnowledgeBase();
* KnowledgeBaseFactory这个工厂将创建并返回一个知识库实例,一个可选的知识库配置
* 知识经济也是由这个工厂自己创造出来的。
* 使用给定的类加载器创建顺序知识库。
* KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
* 知识库kbase =知识库。
*
* newKnowledgeBase()使用默认的KnowledgeBaseConfiguration创建一个新的知识库
*/
KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
/**
* addKnowledgePackages向知识库添加知识包集合,建议您在执行此操作之前先检查知识库。
*
* getKnowledgePackages()收集知识资料返回构建的包
*
*/
kBase.addKnowledgePackages(kb.getKnowledgePackages());
//有状态的知识会话=基本的知识会话;使用默认会话配置创建一个新的有状态知识切换
kSession = kBase.newStatefulKnowledgeSession();
long time1 = System.currentTimeMillis();
Message message = new Message();
System.out.println("清洗前:"+message.getMsg());
for (int i = 0; i < 10; i++) {
Message message2 = new Message();
message2.setStatus(i);
message2.setMsg("hello world! "+i);
//插入(事实);
kSession.insert(message2);
}
kSession.insert(message);
//执行清洗
kSession.fireAllRules();
System.out.println("清洗后:"+message.getMsg());
long time2 = System.currentTimeMillis();
System.out.println("清洗时间:"+(time2 - time1));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} finally {
if (kSession != null)
kSession.dispose();
}
}
}
具体的内部实现可以查看drools的官方文档:http://docs.jboss.org/drools/release/6.3.0.Final/kie-api-javadoc/index.html
在看、转发和辣条会提升颜值哦~
关注我
每天进步一点点
万水千山总是情,点个 “在看” 行不行