drools规则引擎的动态数据库交接使用和压力测试

开发中的真实项目中使用到drools规则引擎所以总结一下

项目路径:

pom.xml

<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>  

 

javabean:Message.java

 

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;  
    }  
}

 

测试demo:TestDroolsDemo

 

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值