• Drools(8):WorkBench使用


    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⽂件中导⼊相关坐标

    1. <dependency>
    2. <groupId>org.droolsgroupId>
    3. <artifactId>drools-compilerartifactId>
    4. <version>7.10.0.Finalversion>
    5. dependency>
    6. <dependency>
    7. <groupId>junitgroupId>
    8. <artifactId>junitartifactId>
    9. <version>4.12version>
    10. dependency>

    第⼆步:在项目中创建⼀个数据对象Order,需要和WorkBench中创建的Order包名、类名完全相 同,属性也需要对应,我这边是com.xiong.order_rules.fact

    1. package com.xiong.order_rules.fact;
    2. public class Order {
    3. private Integer amout;//订单原价⾦额
    4. private Integer score;//积分
    5. @Override
    6. public String toString() {
    7. return "Order{" +
    8. "amout=" + amout +
    9. ", score=" + score +
    10. '}';
    11. }
    12. public Integer getAmout() {
    13. return amout;
    14. }
    15. public void setAmout(Integer amout) {
    16. this.amout = amout;
    17. }
    18. public Integer getScore() {
    19. return score;
    20. }
    21. public void setScore(Integer score) {
    22. this.score = score;
    23. }
    24. }

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

    1. package com.xiongpeng.test;
    2. import com.xiong.order_rules.fact.Order;
    3. import org.drools.core.io.impl.UrlResource;
    4. import org.junit.Test;
    5. import org.kie.api.KieServices;
    6. import org.kie.api.builder.KieModule;
    7. import org.kie.api.builder.KieRepository;
    8. import org.kie.api.runtime.KieContainer;
    9. import org.kie.api.runtime.KieSession;
    10. import java.io.InputStream;
    11. public class TestWorkBench {
    12. @Test
    13. public void test1() throws Exception {
    14. //通过此URL可以访问到maven仓库中的jar包
    15. // URL地址构成:http://ip地址:Tomcat端⼝号/WorkBench⼯程名/maven2/坐标/版 本号/xxx.jar
    16. String url = "http://localhost:8080/kie-drools-wb/maven2/com/xiong/order-rules/1.0.0/order-rules-1.0.0.jar";
    17. KieServices kieServices = KieServices.Factory.get();
    18. // 通过Resource资源对象加载jar包
    19. UrlResource resource = (UrlResource) kieServices.getResources().newUrlResource(url);
    20. // 通过Workbench提供的服务来访问maven仓库中的jar包资源,需要先进⾏Workbench 的认证
    21. resource.setUsername("kie");
    22. resource.setPassword("kie");
    23. resource.setBasicAuthentication("enabled");
    24. //将资源转换为输⼊流,通过此输⼊流可以读取jar包数据
    25. InputStream inputStream = resource.getInputStream();
    26. //创建仓库对象,仓库对象中保存Drools的规则信息
    27. KieRepository repository = kieServices.getRepository();
    28. //通过输⼊流读取maven仓库中的jar包数据,包装成KieModule模块添加到仓库中
    29. KieModule kieModule = repository.addKieModule(kieServices.getResources().newInputStreamResource(inputStream));
    30. //基于KieModule模块创建容器对象,从容器中可以获取session会话
    31. KieContainer kieContainer = kieServices.newKieContainer(kieModule.getReleaseId());
    32. KieSession session = kieContainer.newKieSession();
    33. Order order = new Order();
    34. order.setAmout(500);
    35. session.insert(order);
    36. session.fireAllRules();
    37. session.dispose();
    38. }
    39. }

    执⾏单元测试可以发现控制台已经输出了相关内容。通过WorkBench修改规则输出内容并发布,再次执⾏单元测试可以发现控制台输出的内容也发⽣了变化。

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

  • 相关阅读:
    网关信息查看
    【牛客网刷题】VL5-VL7位拆分与运算、数据处理器、求差值
    @ConfigurationProperties的使用方式
    uniapp - 电商优购项目
    Web3中文|区块链游戏的成长之痛
    bitmap基础介绍+holo实现离线UV计算
    10月最新H5自适应樱花导航网站源码SEO增强版
    Rust 通过 DBC 解析传感器数据
    Vue 数据绑定 和 数据渲染
    【Vue项目复习笔记】tabControl组件的吸顶效果
  • 原文地址:https://blog.csdn.net/u013938578/article/details/126097392