当前位置:网站首页>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修改规则后我们的应⽤不需要任何修改就可以加载到最新的规则从⽽实现规则的动态变更。
边栏推荐
猜你喜欢
Create a devops CI/CD process using the kubesphere GUI
DTG-SSOD: The latest semi-supervised detection framework, Dense Teacher (with paper download)
[kali-information collection] (1.9) Metasploit + search engine tool Shodan
Lexicon 27 - Remove Elements - Simple Questions
QAbstractScrollArea、QScrollArea
What is the future of smartwatches?
【kali-信息收集】(1.9)Metasploit+搜索引擎工具Shodan
如何通过DBeaver 连接 TDengine?
打破千篇一律,DIY属于自己独一无二的商城
力扣35-搜索插入位置——二分查找
随机推荐
云原生(三十) | Kubernetes篇之应用商店-Helm介绍
5G网络切片技术
The ex-boyfriend bought chili water and threatened to rob his daughter. Can the woman apply for a personal safety protection order?
leetcode: 200. Number of islands
List排序 ,取最大值最小值
项目监控六大事项
QT笔记——在一个窗口上显示另外一个透明窗口
Getting Started with Three.JS Programmatic Modeling
JSP中include指令的功能简介说明
SuperSlide系列之轮播图
What is the future of smartwatches?
Several reasons why applet plugins benefit developers
手撸架构,Redis面试41问
JVM学习----垃圾回收调优
Coroutines and Lifecycle in Kotlin
太厉害了,终于有人能把TCP/IP 协议讲的明明白白了
Likou 977-Squaring of ordered arrays - brute force method & double pointer method
大疆P4M云遮挡矫正
雷克萨斯,锁死的安全,挡不住的心寒
测试开发之路,我在大厂做测试这四年的感悟