首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >drools规则引擎的动态数据库交接使用和压力测试

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

作者头像
技术从心
发布2019-08-06 16:44:26
1.3K0
发布2019-08-06 16:44:26
举报
文章被收录于专栏:技术从心技术从心

很早之前研究的规则应擎拿出来总结一下。

一、项目路径:

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

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

关注我

每天进步一点点

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术从心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、项目路径:
  • 二、pom.xml
  • 三、javabean:Message.java
  • 四、测试demo:TestDroolsDemo
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档