当前位置:网站首页>Drools(8):WorkBench使用
Drools(8):WorkBench使用
2022-08-02 12:01:00 【不死鸟.亚历山大.狼崽子】
1 创建项目
进⼊主⻚,点击 Design 中的 projects 链接,进⼊项⽬管理界⾯

点击【Add Project】进⾏添加项⽬

填写项⽬名称及 Maven 相关完成项⽬创建

2 包创建
点击创建好的项⽬,进⼊主界⾯,点击右上⻆的【Create New Asset】,选择【软件包】,创建数据对 象存放的包 com.chenj.order_rules.fact
所有有资源都是通过【Create New Asset】进⾏创建,后⾯将不再赘述。


3 数据对象创建
选择【数据对象】进⾏ Fact 的创建,⾸先创建 Order 对象



点击【添加字段】为当前对象添加字段,设置字段类型及描述
添加字段amout;

添加字段score;

字段添加完成后,可以点击【源代码】查看⽣成的对象是否符合⾃⼰的要求,如果符合,点击
【保存】即可。

4 创建DRL规则⽂件
对象定义完成后,我们来创建⼀个简单规则,同样创建 Asset,选择【DRL⽂件】

创建score-rules.drl

上⾯点击确定按钮完成创建DRL⽂件后,⻚⾯会跳转到编辑DRL⽂件⻚⾯
可以看到DRL规则⽂件⻚⾯分为两个部分:左侧为项⽬浏览视图、右侧为编辑区域,需要注意的是左侧默认展示的不是项⽬浏览视图,需要点击上⾯设置按钮,选择“资料库视图”和“显示为⽂件夹”,如下图所示:

在编辑DRL⽂件⻚⾯右侧区域进⾏DRL⽂件的编写,点击右上⻆保存按钮完成保存操作,点击检 验按钮进⾏规则⽂件语法检查

4 场景测试
规则编写完成后,需要测试通过才可以发布⽣产,在 workbench 中,测试也是可以通过配置完成的。
点击创建 Asset,选择【测试场景】
在弹出的创建测试场景窗⼝中录⼊测试场景的名称,点击确定完成操作

添加所依赖的数据对象,并配置测试条件与期望结果


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


我们给⼯作内存提供的Order对象还需要设置amout属性的值,点击“添加字段”按钮弹出窗⼝,选择amout属性

点击amout属性后⾯的编辑按钮,弹出字段值窗⼝

在弹出的窗⼝中点击字⾯值按钮

amout后⾯出现输⼊框,可以为amout属性设置值

设置好amout属性的值后点击保存按钮保存测试场景
点击右上⻆“运⾏测试场景”按钮进⾏测试

5 规则发布
规则发布前,需要先配置 KieBase 与 KieSession,也就是配置 kmodule.xml ⽂件,在 workbench ⾥⾯,kmodule.xml ⽂件也是通过界⾯配置,然后⾃动⽣成的。
点击项⽬主⻚(Create New Asset 所在⻚⾯)右上⻆的【Settings】按钮,再选择【知识库与会话】



点击右上⻆“Compile”按钮可以对项⽬进⾏编译,点击“Bulid&Deploy”按钮进⾏构建和部署。
部署成功后可以在本地maven仓库中看到当前项⽬已经被打成jar包:

6 在项目中使用部署的规则
第⼀步:在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>第⼆步:在项目中创建⼀个数据对象Order,需要和WorkBench中创建的Order包名、类名完全相 同,属性也需要对应,我这边是com.xiong.order_rules.fact
package com.xiong.order_rules.fact;
public class Order {
private Integer amout;//订单原价⾦额
private Integer score;//积分
@Override
public String toString() {
return "Order{" +
"amout=" + amout +
", score=" + score +
'}';
}
public Integer getAmout() {
return amout;
}
public void setAmout(Integer amout) {
this.amout = amout;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
}
第三步:编写单元测试,远程加载maven仓库中的jar包最终完成规则调⽤
package com.xiongpeng.test;
import com.xiong.order_rules.fact.Order;
import org.drools.core.io.impl.UrlResource;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.builder.KieModule;
import org.kie.api.builder.KieRepository;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import java.io.InputStream;
public class TestWorkBench {
@Test
public void test1() throws Exception {
//通过此URL可以访问到maven仓库中的jar包
// URL地址构成:http://ip地址:Tomcat端⼝号/WorkBench⼯程名/maven2/坐标/版 本号/xxx.jar
String url = "http://localhost:8080/kie-drools-wb/maven2/com/xiong/order-rules/1.0.0/order-rules-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();
Order order = new Order();
order.setAmout(500);
session.insert(order);
session.fireAllRules();
session.dispose();
}
}
执⾏单元测试可以发现控制台已经输出了相关内容。通过WorkBench修改规则输出内容并发布,再次执⾏单元测试可以发现控制台输出的内容也发⽣了变化。
通过上⾯的案例可以发现,我们在IEDA中开发的项⽬中并没有编写规则⽂件,规则⽂件是我们通过WorkBench开发并安装部署到maven仓库中,我们⾃⼰开发的项⽬只需要远程加载maven仓库中的jar 包就可以完成规则的调⽤。这种开发⽅式的好处是我们的应⽤可以和业务规则完全分离,同时通过WorkBench修改规则后我们的应⽤不需要任何修改就可以加载到最新的规则从⽽实现规则的动态变更。
边栏推荐
- NVIDIA NeMo Metrics 轻量性能采集系统
- Crack detection technology based on deep learning
- 云原生(三十) | Kubernetes篇之应用商店-Helm介绍
- AQS-AbstractQueuedSynchronizer
- 面积曲线AUC(area under curve)
- 使用无界队列的线程池会导致内存飙升吗?
- LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之一
- 雷克萨斯,锁死的安全,挡不住的心寒
- 从幻核疑似裁撤看如何保证NFT的安全
- 企业级数据治理工作怎么开展?Datahub这样做
猜你喜欢

DTG-SSOD:最新半监督检测框架,Dense Teacher(附论文下载)

用位运算为你的程序加速

网站自动翻译-网站批量自动翻译-网站免费翻译导出

C#为listview选中的项添加右键菜单

Likou 977-Squaring of ordered arrays - brute force method & double pointer method

主流跨端技术一览

使用kubesphere图形界面创建一个devops的CI/CD流程

Likou 35 - search for insertion position - binary search

云原生(三十) | Kubernetes篇之应用商店-Helm介绍

【Acunetix-Forgot your password】
随机推荐
Solve the problem of Chinese garbled characters in exporting excel file names
Problem solving in the process of using mosquitto
元宇宙“吹鼓手”Unity:疯狂扩局,悬念犹存
Transfer files between servers
手撸架构,网络 面试36问
使用mosquitto过程中的问题解决
【MySQL系列】- LIKE查询 以%开头一定会让索引失效吗
Likou 58 - Left Rotation String
CCF论文会议 IEEE 如何查询某个会议期刊的所有文章
【云驻共创】数据工坊平台,0代码开发数据处理业务“快”人一步
npm install报错npm ERR Could not resolve dependency npm ERR peer
Create your own app applet ecosystem with applet containers
sva assertion data
Thymeleaf
面积曲线AUC(area under curve)
8大软件供应链攻击事件概述
go源码之sync.Waitgroup
Lexicon 27 - Remove Elements - Simple Questions
雷克萨斯,锁死的安全,挡不住的心寒
技术分享| 融合调度系统中的电子围栏功能说明