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

在看、转发和辣条会提升颜值哦~

关注我

每天进步一点点

万水千山总是情,点个 “在看” 行不行

本文分享自微信公众号 - 技术从心(gh_d845efe513db)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券