文章目录
- Drools开源业务规则引擎(四)- 规则流(rule flow)及手把手教你构建jBPM项目
- 1.什么是规则流
- 2.构建jBPM项目
- 2.1.添加maven依赖
- 2.2.创建kmodule.xml
- 2.3.新建drl文件和bpmn2文件
- 2.4.测试方法
- 2.5.日志输出
- 3.Eclipse安装jBPM流程文件可视化编辑器
- 3.1.安装Eclipse
- 3.2.安装Eclipse BPMN 2.0 Modeler插件
- 3.2.1.选择Install New Software
- 3.2.2.点击Add
- 3.2.3.输入插件安装地址
- 3.2.4.勾选并安装
- 3.3.安装jBPM Eclipse 插件
- 4.创建jBPM流程文件
- 4.1.新建BPMN2流程文件
- 4.2.输入文件名称
- 4.3.保存进入编辑页面
- 4.4.修改流程文件的属性
- 4.5.右侧选择元素
- 4.6.查看文件内容
Drools开源业务规则引擎(四)- 规则流(rule flow)及手把手教你构建jBPM项目
1.什么是规则流
Drools
规则流是一个基于事件的有向图,用于描述规则之间的先后顺序和条件关系。规则流由节点和连接线组成。
-
节点:表示规则的执行单元,可以是条件节点、动作节点、决策节点等。条件节点表示规则执行的前提条件,动作节点表示规则执行的操作,决策节点表示根据条件的结果选择不同的规则路径。
-
连接线:表示规则之间的关联关系和执行顺序,有不同的类型,如分支连接线、合并连接线、决策连接线等。
使用规则流,可以在规则执行过程中灵活地控制规则的执行顺序和条件。规则流还提供了多种控制流程的元素,如循环、分支、并行等,可以根据不同的业务需求来构建复杂的规则逻辑。
2.构建jBPM项目
Drools
和jBPM
是两个相互关联的项目,都是由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版本选择
-
Eclipse 3.6 (Helios): http://download.eclipse.org/bpmn2-modeler/updates/helios
-
Eclipse 3.7 - 4.2.1 (Indigo - Juno): http://download.eclipse.org/bpmn2-modeler/updates/juno
-
Eclipse 4.3 (Kepler): http://download.eclipse.org/bpmn2-modeler/updates/kepler
3.2.4.勾选并安装
勾选所有的选项,点击下一步并完成安装
3.3.安装jBPM Eclipse 插件
官方教程:jBPM Eclipse Plugin
同上节安装流程一样,只是安装地址不一样:http://downloads.jboss.org/jbpm/release/6.0.1.Final/updatesite/
不需要选择所有的项目安装,根据官网教程只需要JBoss Drools Core
和 JBoss 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流程文件的元素使用,将会再下一篇博客进行详细介绍。