本篇文章基于 Drools 7.5.0.Final,6.x 版本与7.x在安装上基本类似,但7.x 提供了 docker 镜像,使得 workbench 及 kie-server 的安装比6.x容易了很多倍。
首先需要准备 Docker 环境,Docker 的安装过程不在此赘述,可以参考官网安装教程或者菜鸟教程。安装完成后,由于 Docker 仓库在国外,下载速度可能会很慢,所以可以先配置下 Docker 官方在国内的加速器(其它的镜像加速器,如:阿里、网易等,可能没有 Drools 的镜像),配置方式参考:Docker 中国官方镜像加速。
1. Workbench 安装
第一步:从镜像仓库拉取 drools-workbench 的镜像文件:
docker pull jboss/drools-workbench-showcase
第二步:启动 drools-workbench 镜像:
docker run -p 8080:8080 -p 8001:8001 -d --name drools-wb jboss/drools-workbench-showcase:latest
当容器与应用都启动完成后,你就可以使用如下用户访问地址 http://localhost:8080/drools-wb 去体验 workbench 功能了。
USER PASSWORD ROLE
*********************************************
admin admin admin,analyst,kiemgmt
krisv krisv admin,analyst
john john analyst,Accounting,PM
sales-rep sales-rep analyst,sales
katy katy analyst,HR
jack jack analyst,IT
上面是 showcase 中的用户与角色,如果需要自定义用户体系,需要自己创建 Docker 镜像并对 jboss/drools-workbench 镜像进行扩展,这里不做展开,具体操作请参考Extending this image。
2. Workbench 使用
2.1. 项目创建
进入主页,点击 Design 中的 projects 链接,进入项目管理界面
点击右上角的【Add Project】进行添加项目,填写项目名称及 Maven 三件套完成项目创建。
2.2. 包创建
点击创建好的项目,进入主界面,点击右上角的【Create New Asset】,选择【软件包】,创建数据对象存放的包 com.qchery.harper.fact,再创建规则文件存放的包 com.qchery.harper.rule。
所有有资源都是通过【Create New Asset】进行创建,后面将不再赘述。
2.3. 数据对象创建
选择【数据对象】进行 Fact 的创建,首先创建 Address 对象。
点击【添加字段】为当前对象添加字段,设置字段类型及描述,字段添加完成后,可以点击【源代码】查看生成的对象是否符合自己的要求,如果符合,点击【保存】即可。
创建 ApplyInfo 对象,ApplyInfo 中会包含一个 Address 对象,由此可以看出 Drools 对自定义类型的支持是很好的。
2.4. 规则创建
对象定义完成后,我们来创建一个简单规则,同样创建 Asset,选择【Guided 规则】,在配置规则内容前,需要先添加所依赖的数据对象
依靠刚才添加的数据对象,配置一个简单的规则如下:
配置完成后,同样可以通过【源代码】查看规则的生成情况,另外,还可以点击【校验】去保证规则可以正常编译通过:
2.5. 场景测试
规则编写完成后,需要测试通过才可以发布生产,在 workbench 中,测试也是可以通过配置完成的。
点击创建 Asset,选择【测试场景】,添加所依赖的数据对象,并配置测试条件与期望结果,这里,为了简单起见,我只配置了正向的测试场景,实际应用的过程中,应该还需要配置反向测试场景,保证规则的正确性。
2.6. 规则发布
规则发布前,需要先配置 KieBase 与 KieSession,也就是配置 kmodule.xml 文件,在 workbench 里面,kmodule.xml 文件也是通过界面配置,然后自动生成的。
点击项目主页(Create New Asset 所在页面)右上角的【Settings】按钮,再选择【知识库与会话】
进入配置界面,即可配置知识库与会话,对规则进行灵活的分组,提高规则的可复用性。
配置完成后,即可点击项目主页的【Build&Deploy】进行发布,规则会发布到本地的 maven 仓库中。
3. Kie-server 安装及启动
与 Workbench 的安装方式一样,需要先从仓库拉取最新镜像文件:
docker pull jboss/kie-server-showcase
拉取完成后,启动 kie-server,并链接到一个已经启动的 Workbench 上
docker run -p 8180:8080 -d --name kie-server --link drools-wb:kie_wb jboss/kie-server-showcase:latest
启动完成后,点击 Workbench 首页中【DevOps】下在 【servers】链接,即可看到刚刚发布的规则容器与注册好的 kie-server 服务器,此时只需要选择容器,并点击【启动】就可以将容器与 kie-server 服务器关联起来。
启动完成后,容器界面与服务器界面上都可以看到彼此的信息,我们可以通过 kie-server 提供的 Rest 接口查看服务器及容器的相关信息,默认的用户名密码为 kieserver/kieserver1!
,根据以上配置可以查看到的信息如下:
服务器信息:http://localhost:8180/kie-server/services/rest/server/
容器信息:http://localhost:8180/kie-server/services/rest/server/containers
4. Kie-server 使用
在调用 Rest 接口前,需要先在本地定义一套与 WorkBench 中完全一致的数据对象,可以通过拷贝 Workbench 里面生成的源代码来快速实现,远程规则调用实现代码如下:
import com.qchery.harper.fact.Address;
import com.qchery.harper.fact.ApplyInfo;
import org.kie.api.KieServices;
import org.kie.api.command.Command;
import org.kie.api.command.KieCommands;
import org.kie.api.runtime.ExecutionResults;
import org.kie.server.api.marshalling.MarshallingFormat;
import org.kie.server.api.model.ServiceResponse;
import org.kie.server.client.KieServicesClient;
import org.kie.server.client.KieServicesConfiguration;
import org.kie.server.client.KieServicesFactory;
import org.kie.server.client.RuleServicesClient;
import java.util.LinkedList;
import java.util.List;
public class Main {
public static final String SERVER_URL = "http://localhost:8180/kie-server/services/rest/server";
public static final String PASSWORD = "kieserver1!";
public static final String USERNAME = "kieserver";
public static final String KIE_CONTAINER_ID = "harper_1.0.0";
public static void main(String[] args) {
// KisService 配置信息设置
KieServicesConfiguration kieServicesConfiguration =
KieServicesFactory.newRestConfiguration(SERVER_URL, USERNAME, PASSWORD, 10000L);
kieServicesConfiguration.setMarshallingFormat(MarshallingFormat.JSON);
// 创建规则服务客户端
KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(kieServicesConfiguration);
RuleServicesClient ruleServicesClient = kieServicesClient.getServicesClient(RuleServicesClient.class);
// 规则输入条件
ApplyInfo applyInfo = new ApplyInfo();
applyInfo.setAge(19);
Address familyAddress = new Address();
familyAddress.setProvince("aa");
applyInfo.setFamilyAddress(familyAddress);
// 命令定义,包含插入数据,执行规则
KieCommands kieCommands = KieServices.Factory.get().getCommands();
List<Command<?>> commands = new LinkedList<>();
commands.add(kieCommands.newInsert(applyInfo, "applyInfo"));
commands.add(kieCommands.newFireAllRules());
ServiceResponse<ExecutionResults> results = ruleServicesClient.executeCommandsWithResults(KIE_CONTAINER_ID,
kieCommands.newBatchExecution(commands, "ksessionId"));
// 返回值读取
ApplyInfo value = (ApplyInfo) results.getResult().getValue("applyInfo");
System.out.println(value);
}
}
参考链接: