一、WorkBench 简介
- WorkBench 是 KIE 组件中的元素,也称为 KIE-WB,是 Drools-WB 与 JBPM-WB 的结合体。它是一个可视化的规则编辑器。WorkBench 其实就是一个 war 包,安装到 Tomcat 中就可以运行。使用 WorkBench 可以在浏览器中 创建数据对象、创建规则文件、创建测试场景 并将规则部署到 maven 仓库供其他应用使用。
- 下载地址
- 注意:下载的 war 包需要安装到 Tomcat8 中。
1. 安装方式
- 软件安装时经常会涉及到软件版本兼容性的问题,所以需要明确各个软件的使用版本。
- 软件环境如下:
- 操作系统: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 标签,内容为:
<Valve className="org.kie.integration.tomcat.JACCValve"/>
第七步:启动 Tomcat 并访问 http://localhost:8080/kie-drools-wb,可以看到 WorkBench 的登录页面。使用前面在 tomcat-users.xml 文件中定义的用户进行登录即可。
登录成功后进入系统首页:
2. 使用方式
2.1 创建空间
- WorkBench 中存在空间和项目的概念。我们在使用 WorkBench 时首先需要创建空间(Space),在空间中创建项目,在项目中创建数据对象、规则文件等。
第一步:登录 WorkBench 后进行系统首页,点击首页中的 Design 区域进入项目列表页面:
如果是第一次登录还没有创建项目则无法看到项目
第二步:点击左上角 Spaces 导航链接进入空间列表页面
第三步:点击右上角 Add Space 按钮弹出创建添加空间窗口
录入空间名称,点击Save按钮则完成空间的创建,如下图:
2.2 创建项目
- 前面已经提到,我们在 WorkBench 中需要先创建空间,在空间中才能创建项目。上面我们已经创建了一个空间 qs ,现在需要住此空间中创建项目。
第一步:点击 qs 空间,进入此空间
可以看到当前空间中还没有项目
第二步:点击 Add Project 按钮弹出添加项目窗口
第三步:在添加项目窗口中录入项目名称(例如项目名称为 demo1),点击Add按钮完成操作
可以看到在完成项目创建后,系统直接跳转到了项目页面。要查看当前 qs 空间中的所有项目,可以点击左上角 qs 链接:
2.3 创建数据对象
数据对象其实就是 JavaBean,一般都是在 drl 规则文件中使用进行规则匹配。
第一步:在 qs 空间中点击 demo1 项目,进入此项目页面
第二步:点击 Create New Asset 按钮选择“数据对象”
第三步:在弹出的创建数据对象窗口中输入数据对象的名称,点击确定按钮完成操作
操作完成后可以看到如下:
第四步:点击“添加字段”按钮弹出新建字段窗口
第五步:在新建字段窗口中录入字段 Id(其实就是属性名),选择类型,点击创建按钮完成操作
注意添加完字段后需要点击右上角保存按钮完成保存操作:
点击源代码按钮可以查看刚才创建的 Person 对象源码:
2.4 创建 DRL 规则文件
第一步:在 demo1 项目页面点击右上角 Create New Asset 按钮,选择“DRL文件”,弹出创建 DRL 文件窗口
第二步:在添加 DRL 文件窗口录入 DRL 文件名称,点击确定按钮完成操作
第三步:上面点击确定按钮完成创建 DRL 文件后,页面会跳转到编辑 DRL 文件页面
可以看到 DRL 规则文件页面分为两个部分:左侧为项目浏览视图、右侧为编辑区域,需要注意的是左侧默认展示的不是项目浏览视图,需要点击上面设置按钮,选择“资料库视图”和“显示为文件夹”,如下图所示:
第四步:在编辑 DRL 文件页面右侧区域进行 DRL 文件的编写,点击右上角保存按钮完成保存操作,点击检验按钮进行规则文件语法检查
点击左上角 demo1 项目回到项目页面,可以看到此项目下已经存在两个对象,即 person.drl 规则文件和 Person 类:
2.5 创建测试场景
前面我们已经创建了 Person 数据对象和 person 规则文件,现在我们需要测试一下规则文件中的规则,可以通过创建测试场景来进行测试。
第一步:在项目页面点击 Create New Asset 按钮选择“测试场景”,弹出创建测试场景窗口
第二步:在弹出的创建测试场景窗口中录入测试场景的名称,点击确定完成操作
第三步:因为我们编写的规则文件中需要从工作内存中获取 Person 对象进行规则匹配,所以在测试场景中需要准备 Person 对象给工作内存,点击 “GIVEN” 按钮弹出新建数据录入窗口,选择 Person 类,输入框中输入事实名称(名称任意),如下图
第四步:录入事实名称后点击后面的添加按钮,可以看到 Person 对象已经添加成功
第五步:我们给工作内存提供的 Person 对象还需要设置 age 属性的值,点击 “添加字段” 按钮弹出窗口,选择 age 属性
第六步:点击 age 属性后面的编辑按钮,弹出字段值窗口,在弹出的窗口中点击字面值按钮,重新回到测试场景页面,可以看到age后面出现输入框,可以为age属性设置值,设置好age属性的值后点击保存按钮保存测试场景
第七步:点击右上角“运行测试场景”按钮进行测试
测试成功后可以查看 WorkBench 部署的 Tomcat 控制台:
2.6 设置 KieBase 和 KieSession
第一步:在 demo1 项目页面点击右上角 Settings 按钮进入设置页面
第二步:在设置页面选择“知识库和会话”选项
第三步:在弹出的知识库和会话页面点击“添加”按钮进行设置
第四步:设置完成后点击右上角保存按钮完成设置操作,可以通过左侧浏览视图点击kmodule.xml,查看文件内容
2.7 编译、构建、部署
前面我们已经在 WorkBench 中创建了一个空间 qs,并且在此空间中创建了一个项目 demo1,在此项目中创建了数据文件、规则文件和测试场景,如下图:
点击右上角“Compile”按钮可以对项目进行编译,点击“Bulid&Deploy”按钮进行构建和部署。
部署成功后可以在本地maven仓库中看到当前项目已经被打成jar包:
将上面的 jar 包进行解压,可以看到我们创建的数据对象 Person 和规则文件 person 以及 kmodule.xml 都已经打到 jar 包中了。
3. 在项目中使用部署的规则
前面我们已经在 WorkBench 中创建了 demo1 项目,并且在 demo1 项目中创建了数据文件、规则文件等。最后我们将此项目打成 jar 包部署到了 maven 仓库中。本小节就需要在外部项目中使用我们定义的规则。
第一步:在IDEA中创建一个 maven 项目并在 pom.xml 文件中导入相关坐标
<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>
第二步:在项目中创建一个数据对象 Person,需要和 WorkBench 中创建的 Person 包名、类名完全相同,属性也需要对应
package com.qs.demo1;
/**
* This class was automatically generated by the data modeler tool.
*/
public class Person implements java.io.Serializable {
static final long serialVersionUID = 1L;
private java.lang.String id;
private java.lang.String name;
private int age;
public Person() {
}
public java.lang.String getId() {
return this.id;
}
public void setId(java.lang.String id) {
this.id = id;
}
public java.lang.String getName() {
return this.name;
}
public void setName(java.lang.String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public Person(java.lang.String id, java.lang.String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
}
第三步:编写单元测试,远程加载 maven 仓库中的 jar 包最终完成规则调用
@Test
public void test1() throws Exception {
// 通过此 URL 可以访问到 maven 仓库中的 jar 包
// URL地址构成:http://ip地址:Tomcat端口号/WorkBench工程名/maven2/坐标/版本号/xxx.jar
String url = "http://localhost:8088/kie-drools-wb/maven2/com/qs/demo1/1.0.0/demo1-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 会话
KieContainer kieContainer = kieServices.newKieContainer(kieModule.getReleaseId());
KieSession session = kieContainer.newKieSession();
Person person = new Person();
person.setAge(10);
session.insert(person);
session.fireAllRules();
session.dispose();
}
执行单元测试可以发现控制台已经输出了相关内容。
通过 WorkBench 修改规则输出内容并发布,再次执行单元测试可以发现控制台输出的内容也发生了变化。
通过上面的案例可以发现,我们在 IEDA 中开发的项目中并没有编写规则文件,规则文件是我们通过 WorkBench 开发并安装部署到 Maven 仓库中,我们自己开发的项目只需要远程加载 Maven 仓库中的 jar 包就可以完成规则的调用。这种开发方式的好处是我们的应用可以和业务规则完全分离,同时通过 WorkBench 修改规则后我们的应用不需要任何修改就可以加载到最新的规则从而实现规则的动态变更。