Drools业务规则管理系统25_WorkBench8

一、WorkBench简介

 Workbench是KIE组件中的元素,也称为KIE-WEB,是Drools-WB与JBPM-WB的结合体,它是一个可视化的规则编辑器。

 WorkBench其实就是一个war包,安装到tomcat中就可以运行。使用WorkBench可以在浏览器中创建数据对象(实体类)、创建规则文件、创建测试场景并将规则(打成jar包)部署到maven仓库供其他应用使用。

 Workbench功能十分强大,不仅提供一系规则编辑器,还可以编辑JavaBean。

 下载地址:https://download.jboss.org/drools/release/7.6.0.Final/kie-drools-wb-7.6.0.Final-tomcat8.war

 注意:下载的war包需要安装到tomcat8中。

  

二、windows下安装方式

 软件安装时经常会涉及到软件版本兼容性的问题,所需要明确各个软件的使用版本。

 本课程使用的软件环境如下:

  • 操作系统:windows 10 64位
  • JDK版本:1.8
  • maven版本:3.5.4
  • Tomcat版本:8.5

 具体安装步骤:

  第一步:配置Tomcat的环境变量CATALINA_HOME,对应的值为Tomcat安装目录

  第二步:在Tomcat的bin目录下创建setenv.bat文件,内容如下:

CATALINA_OPTS="-Xmx512M -Djava.security.auth.login.config=$CATALINA_HOME/webapps/kie-drools-wb/WEB-INF/classes/login.config -Dorg.jboss.logging.provider=jdk"

  第三步:将下载的WorkBench的war包改名为kie-drools-wb.war并复制到Tomcat的webapps目录下

  第四步:修改Tomcat下conf/tomcat-users.xml文件

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">
  <!--定义admin角色-->
  <role rolename="admin"/>
  <!--定义一个用户,用户名为kie,密码为kie,对应的角色为admin角色-->
  <user username="kie" password="kie" roles="admin"/>
</tomcat-users>

  第五步:下载以下三个jar包并复制到Tomcat的lib目录下

kie-tomcat-integration-7.10.0.Final.jar
javax.security.jacc-api-1.5.jar
slf4j-api-1.7.25.jar

  第六步:修改Tomcat的conf/server.xml文件,添加Valve标签到Host标签内,内容为:

<Valve className="org.kie.integration.tomcat.JACCValve"/>

  第七步:双击startup.bat启动Tomcat,访问http://localhost:8080/kie-drools-wb,可以看到WorkBench的登录页面。使用前面在tomcat-users.xml文件中定义的用户kie\kie进行登录即可

   

   登录后界面

   

三、linux下安装方式

 只需要新增setenv.sh

CATALINA_OPTS="-Xmx512M -Djava.security.auth.login.config=$CATALINA_HOME/webapps/kie-drools-wb/WEB-INF/classes/login.config -Dorg.jboss.logging.provider=jdk"

 注意在环境变量中定义CATALINA_HOME

四、使用方式

 1、创建空间、项目

  WorkBench中存在空间和项目的概念。我们在使用WorkBench时首先需要创建空间(Space),在空间中创建项目,在项目中创建数据对象、规则文件等。

  • 创建空间

  第一步:登录WorkBench后进行系统首页,点击首页中的Design区域进入项目列表页面:

   如果是第一次登录还没有创建项目则无法看到项目

   

  第二步:点击左上角Spaces导航链接进入空间列表页面

   

  第三步:点击右上角Add Space按钮弹出创建添加空间窗口

   录入空间名称,点击Save按钮则完成空间的创建,如下图:

   

   

  • 创建项目

  前面已经提到,我们在WorkBench中需要先创建空间,在空间中才能创建项目。上面我们已经创建了一个空间,现在需要在此空间中创建项目  

  第一步:点击空间,进入此空间

   

   可以看到当前空间中还没有项目

  第二步:点击Add Project按钮弹出添加项目窗口

  第三步:在添加窗口中录入项目名称,点击Add按钮完成操作

   

   

  可以看到在完成项目创建后,系统直接跳转到了项目页面。要查看当前空间中的所有项目,可以点击左上角新建的空间名称:

   

 2、创建数据对象

  数据对象其实就是JavaBean,一般都是在drl规则文件中使用进行规则匹配。

  第一步:在空间中点击项目名称,进入项目页面

   

  第二步:点击Create New Asset按钮选择“数据对象”

   

   第三步:在弹出的创建数据对象窗口中输入数据对象的名称,点击确定按钮完成操作

   

   操作完成后可以看到如下:

   

  第四步:点击“添加字段”按钮弹出新建字段窗口 

  第五步:在新建字段窗口中录入字段Id(其实就是属性名),选择类型,点击创建按钮完成操作

   

   完成操作后可以看到刚才创建的字段:

   

   可以点击添加字段按钮继续创建其他字段:

   

  注意添加完字段后需要点击右上角保存按钮完成保存操作。 

  点击源代码按钮可以查看刚才创建的Student对象源码:

   

  点击左上角项目链接,可以看到当前myproject_1项目中已经创建的各种类型的对象:

    

 3、创建DRL规则文件

  第一步:在myproject_1项目页面点击右上角Create New Asset按钮,选择“DRL文件”,弹出创建DRL文件窗口

   

  第二步:在添加DRL文件窗口录入DRL文件名称,点击确定按钮完成操作   

   

  第三步:上面点击确定按钮完成创建DRL文件后,页面会跳转到编辑DRL文件页面 

   

 

  第四步:在编辑DRL文件页面右侧区域进行DRL文件的编写,点击右上角保存按钮完成保存操作,点击检验按钮进行规则文件语法检查

package com.myspace_1.myproject_1;

import com.myspace_1.myproject_1.Student

rule "rule_1"
    when
        com.myspace_1.myproject_1.Student(age < 20 && name !=null)
    then
        System.out.println("规则:rule_1触发了");
end

   

   

  可以看到DRL规则文件页面分为两部分:左侧为项目浏览试图、右侧为编辑区域,需要注意的是左侧默认展示的不是项目浏览试图,需要点击上面设置按钮,选择“资料库试图”和“显示为文件夹”,如下图:

   

   

    

  点击左上角myproject_1项目回到项目页面,可以看到此项目下已经存在两个对象:

   

 4、创建测试场景

  前面我们已经创建了Student数据对象和student规则文件,现在我们需要测试一下规则文件中的规则,可以通过创建测试场景来进行测试。

  第一步:在项目页面点击Create New Asset按钮选择“测试场景”,弹出创建测试场景窗口

   

  第二步:在弹出的创建测试场景窗口中录入测试场景的名称,点击确定完成操作

   

   完成测试场景的创建后,页面会跳转到测试场景编辑页面,如下图:

   

  第三步:因为我们编写的规则文件中需要从工作内存中获取Student对象进行规则匹配,所以在测试场景中需要准备Student对象给工作内存,点击“GIVEN”按钮弹出新建数据录入窗口,选择Student类,输入框中输入事实名称(名称任意),如下图

   

  第四步:录入事实名称后点击后面的添加按钮,可以看到Student对象已经添加成功

   

   

  第五步:我们给工作内存提供的Student对象还需要设置age属性的值,点击“添加字段”按钮弹出窗口,选择age属性

   

   点击确定按钮后可以看到字段已经添加成功:

   

  第六步:点击age属性后面的编辑按钮,弹出字段值窗口

   

  第七步:在弹出的窗口中点击字面值按钮,重新回到测试场景页面,可以看到age后面出现输入框,可以为age属性设置值

   

   

   设置好age属性的值后点击保存按钮保存测试场景

   继续添加字段,点击“插入 'Student'”

      

  第八步:点击右上角“运行测试场景”按钮进行测试

   

  测试成功后可以查看WorkBench部署的Tomcat控制台:

   

  点击左上角myproject_1项目回到项目页面,可以看到此项目下已经存在三个对象:

   

 5、设置KieBase和KieSession

  第一步:在myproject_1项目页面点击右上角Settings按钮进入设置页面

   

  第二步:在设置页面选择“知识库和会话”选项

   

  第三步:在弹出的知识库和会话页面点击“添加”按钮进行设置

   

   

   

   

   

  第四步:设置完成后点击右上角保存按钮完成设置操作,可以通过左侧浏览视图点击kmodule.xml,查看文件内容

   

 6、编译、构建、部署

  前面我们已经在WorkBench中创建了一个空间myspace_1,并且在此空间中创建了一个项目myproject_1,在此项目中创建了数据文件、规则文件和测试场景,如下图:

   

  点击右上角“Compile”按钮可以对项目进行编译,点击“Bulid&Deploy”按钮进行构建和部署。

  部署成功后可以在本地maven仓库中看到当前项目已经被打成jar包:

   

  将上面的jar包进行解压,可以看到我们创建的数据对象Student和规则文件student以及kmodule.xml都已经打到jar包中了。

     

 7、在项目中使用部署的规则

  前面我们已经在WorkBench中创建了myproject_1项目,并且在myproject_1项目中创建了数据文件、规则文件等。最后我们将此项目打成jar包部署到了maven仓库中。本小节就需要在外部项目中使用我们定义的规则。

  第一步:在IDEA中创建一个maven项目并在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>com.itheima</groupId>
    <artifactId>testWB</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>7.10.0.Final</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</project>

  第二步:在项目中创建一个数据对象Student,需要和WorkBench中创建的Student包名、类名完全相同,属性也需要对应

   可以把WorkBench中Student数据对象源代码中的内容全部拷贝过来。

package com.myspace_1.myproject_1;

public class Student implements java.io.Serializable {

    private Integer id;
    private String name;
    private int age;
    private String address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

  第三步:编写单元测试,远程加载maven仓库中的jar包最终完成规则调用

    //远程加载maven仓库中的jar包,因为我们的规则在jar包中
    @Test
    public void test1() throws Exception {
        //通过此URL可以访问到maven仓库中的jar包
        //URL地址构成:http://ip地址:Tomcat端口号/WorkBench工程名/maven2/坐标/版本号/xxx.jar,maven2wb不行
        String url = "http://localhost:8080/kie-drools-wb/maven2/com/myspace_1/myproject_1/1.0.0/myproject_1-1.0.0.jar";

        KieServices kieServices = KieServices.Factory.get();

        //通过Resource资源对象加载jar包
        UrlResource resource = (UrlResource) kieServices.getResources().newUrlResource(url);
        //通过Workbench提供的服务来访问maven仓库中的jar包资源,需要先进行Workbench的认证
        resource.setUsername("kie");
        resource.setPassword("kie");
        resource.setBasicAuthentication("enabled");

        //将资源转换为输入流,通过此输入流可以读取jar包数据
        InputStream inputStream = resource.getInputStream();

        //创建仓库对象,仓库对象中保存Drools的规则信息
        KieRepository repository = kieServices.getRepository();

        //通过输入流读取maven仓库中的jar包数据,包装成KieModule模块添加到仓库中
        KieModule kieModule = repository.addKieModule(kieServices.getResources().newInputStreamResource(inputStream));

        //基于KieModule模块创建容器对象,从容器中可以获取session会话.releaseId是jar包的坐标
        KieContainer kieContainer = kieServices.newKieContainer(kieModule.getReleaseId());
        KieSession session = kieContainer.newKieSession();

        Student student = new Student();
        student.setAge(10);
        student.setName("zhangsan");
        session.insert(student);

        session.fireAllRules();
        session.dispose();
    }

  执行test1,控制台输出结果:

   

  其中url仓库地址获取方式见下图:

   

   

   

   

  通过WorkBench修改规则输出内容并发布(需要保存后重新进行Build&Deploy并进行覆盖),再次执行单元测试可以发现控制台输出的内容也发生了变化。

  **通过上面的案例可以发现,我们在IEDA中开发的项目中并没有编写规则文件,规则文件是我们通过WorkBench开发并安装部署到maven仓库中,我们自己开发的项目只需要远程加载maven仓库中的jar包就可以完成规则的调用。这种开发方式的好处是我们的应用可以和业务规则完全分离,同时通过WorkBench修改规则后我们的应用不需要任何修改就可以加载到最新的规则从而实现规则的动态变更。

 

posted on 2024-04-08 19:02  花溪月影  阅读(66)  评论(0编辑  收藏  举报