Drools开源业务规则引擎(四)- 规则流(rule flow)及手把手教你构建jBPM项目

Drools开源业务规则引擎(四)- 规则流(rule flow)及手把手教你构建jBPM项目

1.什么是规则流

Drools规则流是一个基于事件的有向图,用于描述规则之间的先后顺序和条件关系。规则流由节点连接线组成。

  • 节点:表示规则的执行单元,可以是条件节点、动作节点、决策节点等。条件节点表示规则执行的前提条件,动作节点表示规则执行的操作,决策节点表示根据条件的结果选择不同的规则路径。

  • 连接线:表示规则之间的关联关系和执行顺序,有不同的类型,如分支连接线、合并连接线、决策连接线等。

使用规则流,可以在规则执行过程中灵活地控制规则的执行顺序和条件。规则流还提供了多种控制流程的元素,如循环、分支、并行等,可以根据不同的业务需求来构建复杂的规则逻辑。

2.构建jBPM项目

DroolsjBPM是两个相互关联的项目,都是由Red Hat(前身为JBoss)开发和维护的。

jBPM是一个开源的业务流程管理(BPM)系统,用于设计、执行和监控业务流程。jBPM可以与Drools规则引擎无缝集成,通过规则节点将规则和决策引入业务流程中。它提供了建模器和编辑器来设计和模型化业务流程,并提供了执行引擎来管理和执行这些流程。

2.1.添加maven依赖

本文仍在前面篇幅的springboot项目上搭建,只需添加以下依赖即可:

				<!--如果没有导入drools的,别忘了添加drools依赖-->
<!--        <dependency>-->
<!--            <groupId>org.drools</groupId>-->
<!--            <artifactId>drools-compiler</artifactId>-->
<!--            <version>7.6.0.Final</version>-->
<!--        </dependency>-->

				<!--drools和jbpm的依赖版本一致-->
        <dependency>
            <groupId>org.jbpm</groupId>
            <artifactId>jbpm-bpmn2</artifactId>
            <version>7.6.0.Final</version>
        </dependency>

2.2.创建kmodule.xml

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="rule-flow-kbase" packages="drools.flow">
        <ksession name="sessionName"/>
    </kbase>
</kmodule>

resources目录下:META-INF/kmodule.xml

在这里插入图片描述

2.3.新建drl文件和bpmn2文件

demo.drl

package drools.flow;
dialect  "mvel"

// 导入输入类型
import com.ahao.project.input.UserIn;
global com.ahao.project.output.UserOut output;


rule "flow-demo"
ruleflow-group "Group1"
when
    $in:UserIn()
then
    output.setAgeStages("命中规则:flow-demo");
end

drl.bpmn2

<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:g="http://www.jboss.org/drools/flow/gpd" xmlns:tns="http://www.jboss.org/drools" xmlns="http://www.jboss.org/drools" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd http://www.jboss.org/drools drools.xsd http://www.bpsim.org/schemas/1.0 bpsim.xsd" id="Definition" expressionLanguage="http://www.mvel.org/2.0" targetNamespace="http://www.jboss.org/drools" typeLanguage="http://www.java.com/javaTypes">
  <bpmn2:process id="my_demo_1" tns:version="1" tns:packageName="drools.flow" tns:adHoc="false" name="my_demo" isExecutable="true" processType="Private">
    <bpmn2:startEvent id="_jbpm-unique-0" name="开始" isInterrupting="false">
      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:sequenceFlow id="SequenceFlow_2" tns:priority="1" sourceRef="_jbpm-unique-0" targetRef="BusinessRuleTask_1"/>
    <bpmn2:businessRuleTask id="BusinessRuleTask_1" tns:ruleFlowGroup="Group1" name="业务规则">
      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>
      <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>
    </bpmn2:businessRuleTask>
    <bpmn2:sequenceFlow id="SequenceFlow_3" tns:priority="1" sourceRef="BusinessRuleTask_1" targetRef="EndEvent_2"/>
    <bpmn2:endEvent id="EndEvent_2" name="结束">
      <bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>
      <bpmn2:terminateEventDefinition id="TerminateEventDefinition_1"/>
    </bpmn2:endEvent>
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_Process_1" bpmnElement="my_demo_1">
      <bpmndi:BPMNShape id="BPMNShape_StartEvent_1" bpmnElement="_jbpm-unique-0">
        <dc:Bounds height="48.0" width="48.0" x="105.0" y="125.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="BPMNShape_EndEvent_2" bpmnElement="EndEvent_2">
        <dc:Bounds height="36.0" width="36.0" x="396.0" y="138.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="BPMNShape_BusinessRuleTask_3" bpmnElement="BusinessRuleTask_1">
        <dc:Bounds height="50.0" width="110.0" x="220.0" y="120.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_4" bpmnElement="SequenceFlow_2" sourceElement="BPMNShape_StartEvent_1" targetElement="BPMNShape_BusinessRuleTask_3">
        <di:waypoint xsi:type="dc:Point" x="153.0" y="149.0"/>
        <di:waypoint xsi:type="dc:Point" x="183.0" y="149.0"/>
        <di:waypoint xsi:type="dc:Point" x="183.0" y="145.0"/>
        <di:waypoint xsi:type="dc:Point" x="220.0" y="145.0"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_5" bpmnElement="SequenceFlow_3" sourceElement="BPMNShape_BusinessRuleTask_3" targetElement="BPMNShape_EndEvent_2">
        <di:waypoint xsi:type="dc:Point" x="330.0" y="145.0"/>
        <di:waypoint xsi:type="dc:Point" x="359.0" y="145.0"/>
        <di:waypoint xsi:type="dc:Point" x="359.0" y="156.0"/>
        <di:waypoint xsi:type="dc:Point" x="396.0" y="156.0"/>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

resources目录下:

在这里插入图片描述

注意⚠️:有关bpmn2文件会在下一个节说明

2.4.测试方法

    @Test
    public void test(){
        KieServices ks = KieServices.Factory.get();
        // 获取一个Kie容器对象,该容器对象包含了从类路径中加载的规则(如DRL文件)、模型和其他相关资源。
        KieContainer kieContainer = ks.getKieClasspathContainer();
        // 获取KieSession
        KieSession kieSession = kieContainer.newKieSession("sessionName");
        // 创建规则输出对象
        UserOut output = new UserOut();
        kieSession.setGlobal("output", output);
        // 创建规则输入对象
        UserIn input = new UserIn();
        input.setAge(19);
        // 执行规则
        kieSession.insert(input);
      	// 创建一个流程事件监听器
        kieSession.addEventListener(new DebugProcessEventListener());
        // 指定流程id
      	// drl.bpmn2文件中的process:id
      	// <bpmn2:process id="my_demo_1" tns:version="1" tns:packageName="drools.flow" tns:adHoc="false" name="my_demo" isExecutable="true" processType="Private">
        kieSession.startProcess("my_demo_1");
        kieSession.fireAllRules();
        kieSession.dispose();
        System.out.println(output);
    }

2.5.日志输出

14:22:23.468 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessStarted(name=my_demo; id=my_demo_1)]
14:22:23.480 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeTriggered(nodeId=1; id=0; nodeName=开始; processName=my_demo; processId=my_demo_1)]
14:22:23.481 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeLeft(nodeId=1; id=0; nodeName=开始; processName=my_demo; processId=my_demo_1)]
14:22:23.481 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeTriggered(nodeId=2; id=1; nodeName=业务规则; processName=my_demo; processId=my_demo_1)]
14:22:23.483 [main] DEBUG org.drools.core.common.DefaultAgenda - State was INACTIVE is now FIRING_ALL_RULES
14:22:23.518 [main] DEBUG org.drools.core.common.DefaultAgenda - State was FIRING_ALL_RULES is now HALTING
14:22:23.518 [main] DEBUG org.drools.core.common.DefaultAgenda - State was HALTING is now INACTIVE
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeLeft(nodeId=2; id=1; nodeName=业务规则; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeTriggered(nodeId=3; id=2; nodeName=结束; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeLeft(nodeId=3; id=2; nodeName=结束; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessCompleted(name=my_demo; id=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessCompleted(name=my_demo; id=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeLeft(nodeId=3; id=2; nodeName=结束; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeTriggered(nodeId=3; id=2; nodeName=结束; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeLeft(nodeId=2; id=1; nodeName=业务规则; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeTriggered(nodeId=2; id=1; nodeName=业务规则; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeLeft(nodeId=1; id=0; nodeName=开始; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeTriggered(nodeId=1; id=0; nodeName=开始; processName=my_demo; processId=my_demo_1)]
14:22:23.520 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessStarted(name=my_demo; id=my_demo_1)]
14:22:23.520 [main] DEBUG org.drools.core.common.DefaultAgenda - State was INACTIVE is now FIRING_ALL_RULES
14:22:23.520 [main] DEBUG org.drools.core.common.DefaultAgenda - State was FIRING_ALL_RULES is now HALTING
14:22:23.520 [main] DEBUG org.drools.core.common.DefaultAgenda - State was HALTING is now INACTIVE
UserOut(ageStages=命中规则:flow-demo)

至此一个业务流程+规则引擎项目集成完毕。但是相信很多读者都能较好的理解drl文件的内容,毕竟国内有关drools的教程和文档还算全面。相对而言,jBPM项目的流程文件(上述的bpmn2文件)就比较少,并且jBPM有一套自己的XML Schema,有关其bpmn2.xml内容说明,本篇博客将不做介绍(因为博主也还在研究中,只是有些浅显的认知),而且手搓代码也没有必要,先介绍一个图形化的编辑工具 Eclipse BPMN 2.0 Modeler,之所以选择Eclipse,没有选择IDEA,因为IDEA没有专门的jBPM流程文件的编辑器(单纯的bpmn编辑器肯定是不够的呀😂)。

3.Eclipse安装jBPM流程文件可视化编辑器

Eclipse BPMN2 Modeler是一个开源的Eclipse插件,用于在Eclipse中创建和编辑BPMN(业务流程建模和标记语言)模型。

该插件为Eclipse提供了一套工具和编辑器,可帮助用户通过图形化界面轻松绘制和修改BPMN模型。它支持BPMN 2.0规范,并提供了各种元素(例如任务、网关、事件等)和连接(例如顺序流、消息流等)来构建流程模型。

3.1.安装Eclipse

本节不详细说明,网上都有很多教程。博主安装版本为Version: 2022-09 (4.25.0)

3.2.安装Eclipse BPMN 2.0 Modeler插件

官方教程: Installation

3.2.1.选择Install New Software

在这里插入图片描述

3.2.2.点击Add

在这里插入图片描述

3.2.3.输入插件安装地址

根据自己安装的Eclipse版本选择

在这里插入图片描述

3.2.4.勾选并安装

勾选所有的选项,点击下一步并完成安装

在这里插入图片描述
在这里插入图片描述

注意版本问题:
官网地址:https://download.eclipse.org/bpmn2-modeler/updates/
不同的版本其编辑界面中相应组件元素的内容不一样,博主选择的为1.0.5.Final。

3.3.安装jBPM Eclipse 插件

官方教程:jBPM Eclipse Plugin

同上节安装流程一样,只是安装地址不一样:http://downloads.jboss.org/jbpm/release/6.0.1.Final/updatesite/

不需要选择所有的项目安装,根据官网教程只需要JBoss Drools CoreJBoss jBPM Core 就行。

在这里插入图片描述

4.创建jBPM流程文件

4.1.新建BPMN2流程文件

在这里插入图片描述

4.2.输入文件名称

在这里插入图片描述

4.3.保存进入编辑页面

在这里插入图片描述

4.4.修改流程文件的属性

对应上述bpmn2文件中对应xml标签的属性

<bpmn2:process id=“my_demo_1” tns:version=“1” tns:packageName=“drools.flow” tns:adHoc=“false” name=“my_demo” isExecutable=“true” processType=“Private”>

在这里插入图片描述

4.5.右侧选择元素

在这里插入图片描述

4.6.查看文件内容

在这里插入图片描述

至此,可视化编辑器安装和jBPM流程文件的创建流程介绍完了,有关jBPM流程文件的元素使用,将会再下一篇博客进行详细介绍。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值