当前位置: 首页 > news >正文

Drools开源业务规则引擎(五)- jBPM流程图元素介绍

文章目录

  • Drools开源业务规则引擎(五)- jBPM流程图元素介绍
    • 1.process
    • 2.startEvent
    • 3.Connections
      • 3.1.sequenceFlow
      • 3.2.Association
    • 4.Activities
      • 4.1.businessRuleTask
      • 4.2.scriptTask
    • 5.Gateways
      • 5.1.exclusiveGateway
    • 6.endEvent

Drools开源业务规则引擎(五)- jBPM流程图元素介绍

阅前须知:

​ 根据本文操作前,请先根据上一篇文章《Drools开源业务规则引擎(四)- 规则流(rule flow)及手把手教你构建jBPM项目》搭建好相关开发环境。博主会在空闲时间内持续更新本文

1.process

在 jBPM 中,process 是用于定义和配置业务流程的关键元素之一,通过BPMN 2.0规范中的<process>元素表示。process表示业务流程的起始和结束点。它定义了一个独立的业务流程,由一系列的活动、网关、事件和连接组成。每个<process>元素都有一个唯一的ID,用于在 jBPM 中唯一标识该流程。

主要属性如下:

  • Id:流程的唯一标识符。每个流程都必须有一个唯一的ID。
  • Name:流程的名称。
  • Version:流程的版本号。
  • Package Name:流程所属的包名称。(一般为流程文件所在包名)
  • Is Executable:是否可执行。

示例

在这里插入图片描述

2.startEvent

开始事件(例如消息、定时器、信号等),用于启动一个流程实例。它标记了流程的开始,作为执行流程的入口点。

示例

在这里插入图片描述

3.Connections

连接器,用于在不同的流程节点之间传递数据和信息

3.1.sequenceFlow

顺序流是连接流程中不同活动的一种方式,用于定义活动之间的顺序关系和流程控制。

示例

在这里插入图片描述

3.2.Association

关联(Association)是一种连接流程图元素和相关信息或文档的方式。它用于表示两个元素之间的关系,而不影响流程的控制流。关联与顺序流(Sequence Flow)不同,顺序流表示流程的顺序性和传递性,而关联则表示额外的信息和关系。关联不会影响流程的流转,只提供了一种可选的附加信息。

  • 数据关联(Data Association)用于在流程中传递和关联数据。它可以将输入数据传递给任务、子流程或事件,并将结果数据传递回流程中。

    • 输入数据关联:通过将数据关联到任务、子流程或事件中,可以将必要的输入数据传递给它们。

    • 输出数据关联:当任务、子流程或事件完成后,可以将结果数据关联回流程中。输出数据关联通常发生在任务、子流程或事件的完成之后,把结果数据传递给流程的下一个节点。

4.Activities

活动节点,如任务节点、自动节点等

4.1.businessRuleTask

jBPM 中的一种任务节点类型,用于执行业务规则。业务规则是指定义和描述业务逻辑的一组规则,它们可以在应用程序中灵活地配置和调整,而无需修改代码。业务规则通常用于根据一组预定义的条件和约束来进行决策和执行特定的操作。

在 jBPM 中的流程中,可以使用 “Business Rule Task” 来执行业务规则。这个任务节点类型可以与规则引擎(如Drools规则引擎)进行集成,以便在流程执行过程中应用和评估业务规则。通过配置 “Business Rule Task”,可以指定要应用的规则集,以及规则的输入参数和输出结果。当流程执行到该任务节点时,规则引擎会根据预定义的规则集对输入参数进行计算和评估,并生成相应的输出结果。 “Business Rule Task” 的执行结果可以被其他任务节点使用,或者影响流程的走向和后续动作。它使业务逻辑得以动态调整和变化,从而提供了更大的灵活性和可扩展性。

主要属性如下:

  • Name:任务节点的名称,用于在流程定义中标识该任务节点。
  • Rule Flow Group:指定要使用的规则流组。规则流组是一组相关规则的集合,可以根据需要对规则进行组织和管理。
  • On Entry Script:任务节点进入时执行的脚本或表达式,支持Java,MVEL两种语言。这些脚本或表达式通常用于在任务节点执行前执行一些预处理逻辑、初始化变量、设置环境等。
  • On Exit Script:任务节点离开时执行的脚本或表达式,支持Java,MVEL两种语言。

示例

在这里插入图片描述

4.2.scriptTask

脚本任务(Script Task)表示在流程中执行自定义脚本或代码的操作。脚本任务通常用于执行一些简单的操作,而无需创建独立的服务或规则任务。

脚本任务通常用于以下几种情况:

  • 计算或转换数据:执行一些简单的计算或数据转换操作。
  • 校验或判断条件:脚本任务可以执行一些条件判断,根据不同的条件来决定流程的走向。
  • 调用外部系统或服务:例如,使用Java脚本调用RESTful API。

示例

在这里插入图片描述

5.Gateways

网关在流程图中用于控制流程的分支和合并,根据不同的条件或规则来选择不同的路径。

5.1.exclusiveGateway

排他网关,也称为分支网关。排他网关用于在流程中做出简单的选择,仅选择一个满足条件的路径。每个条件表达式都与一个出口连接相关联,只有满足条件的出口才会被选择。

主要属性如下:

  • 默认出口(Default Flow):排他网关可以有一个默认出口,当其他条件都不满足时,流程会选择默认出口。默认出口通常不需要设置条件,它只是用于在没有其他路径满足时作为备用路径。

    在这里插入图片描述

  • 条件表达式(Condition Expression):对于排他网关的每个出口,可以设置一个条件表达式。条件表达式用于评估在特定情况下选择哪个出口。条件表达式可以是简单的布尔表达式,也可以是复杂的规则表达式。例如,条件表达式可以使用流程变量、业务规则或脚本语言来定义。

    在这里插入图片描述

  • 优先级(Priority):表示出口顺序流的执行优先级。值越小,优先级越高。

  • 网关用法(Gateway Direction):

    • 分支(Diverging):分支网关用于流程的分支,将流程的执行分发到不同的路径上。在分支网关中,有一个入口和多个出口,根据条件或规则选择不同的出口路径。分支网关的方向指向多个出口,表示流程将沿着这些出口执行不同的路径。

    在这里插入图片描述

    • 合并(Converging):合并网关用于流程的合并,将来自不同路径的流程实例汇聚到一个节点上。在合并网关中,有多个入口和一个出口,当前需要等待所有入口上的流程实例到达合并网关时,才会将流程实例汇聚到下一个节点。合并网关的方向指向一个出口,表示流程将汇聚到该出口继续执行。

      在这里插入图片描述

    • 循环(Converging and Diverging):循环网关用于对流程进行循环执行,即将流程返回到之前的某个节点或循环体中重复执行。循环网关在进入循环体之前会进行条件的判断,如果满足条件,则流程会回到指定的节点或循环体继续执行。循环网关既有分支的方向,也有合并的方向。

示例

在这里插入图片描述

<?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="Process_2" tns:version="1" tns:packageName="drools.flow3" tns:adHoc="false" name="流程案例" isExecutable="true"><bpmn2:startEvent id="StartEvent_1" name="流程入口点"><bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing></bpmn2:startEvent><bpmn2:sequenceFlow id="SequenceFlow_1" tns:priority="1" name="c1" sourceRef="StartEvent_1" targetRef="ExclusiveGateway_1"/><bpmn2:exclusiveGateway id="ExclusiveGateway_1" name="效验年龄" gatewayDirection="Diverging" default="SequenceFlow_4"><bpmn2:incoming>SequenceFlow_1</bpmn2:incoming><bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing><bpmn2:outgoing>SequenceFlow_4</bpmn2:outgoing></bpmn2:exclusiveGateway><bpmn2:sequenceFlow id="SequenceFlow_3" tns:priority="1" name="年龄小于20" sourceRef="ExclusiveGateway_1" targetRef="BusinessRuleTask_2"><bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression" id="FormalExpression_3" language="http://www.jboss.org/drools/rule">UserIn(age &lt; 20);</bpmn2:conditionExpression></bpmn2:sequenceFlow><bpmn2:sequenceFlow id="SequenceFlow_4" tns:priority="999" name="默认分支" sourceRef="ExclusiveGateway_1" targetRef="BusinessRuleTask_1"/><bpmn2:businessRuleTask id="BusinessRuleTask_2" tns:ruleFlowGroup="rfg_1" name="规则流1"><bpmn2:extensionElements><tns:onEntry-script scriptFormat="http://www.java.com/java"><tns:script>System.out.println(&quot;Entry:进入rfg_1&quot;);</tns:script></tns:onEntry-script><tns:onExit-script scriptFormat="http://www.java.com/java"><tns:script></tns:script></tns:onExit-script></bpmn2:extensionElements><bpmn2:incoming>SequenceFlow_3</bpmn2:incoming><bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing></bpmn2:businessRuleTask><bpmn2:sequenceFlow id="SequenceFlow_2" tns:priority="1" name="" sourceRef="BusinessRuleTask_2" targetRef="ExclusiveGateway_2"/><bpmn2:businessRuleTask id="BusinessRuleTask_1" tns:ruleFlowGroup="bottom" name="规则流3"><bpmn2:extensionElements><tns:onEntry-script scriptFormat="http://www.java.com/java"><tns:script>System.out.println(&quot;进入默认分支&quot;);</tns:script></tns:onEntry-script><tns:onExit-script scriptFormat="http://www.java.com/java"><tns:script></tns:script></tns:onExit-script></bpmn2:extensionElements><bpmn2:incoming>SequenceFlow_4</bpmn2:incoming><bpmn2:outgoing>SequenceFlow_5</bpmn2:outgoing></bpmn2:businessRuleTask><bpmn2:exclusiveGateway id="ExclusiveGateway_2" name="执行结果合并" gatewayDirection="Converging"><bpmn2:incoming>SequenceFlow_2</bpmn2:incoming><bpmn2:incoming>SequenceFlow_5</bpmn2:incoming><bpmn2:outgoing>SequenceFlow_6</bpmn2:outgoing></bpmn2:exclusiveGateway><bpmn2:endEvent id="EndEvent_1" name="流程结束点"><bpmn2:incoming>SequenceFlow_6</bpmn2:incoming></bpmn2:endEvent><bpmn2:sequenceFlow id="SequenceFlow_5" tns:priority="1" sourceRef="BusinessRuleTask_1" targetRef="ExclusiveGateway_2"/><bpmn2:sequenceFlow id="SequenceFlow_6" tns:priority="1" sourceRef="ExclusiveGateway_2" targetRef="EndEvent_1"/></bpmn2:process><bpmndi:BPMNDiagram id="BPMNDiagram_1" name="流程案例"><bpmndi:BPMNPlane id="BPMNPlane_Process_1" bpmnElement="Process_2"><bpmndi:BPMNShape id="BPMNShape_StartEvent_1" bpmnElement="StartEvent_1"><dc:Bounds height="36.0" width="36.0" x="142.0" y="122.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="BPMNShape_EndEvent_1" bpmnElement="EndEvent_1"><dc:Bounds height="36.0" width="36.0" x="790.0" y="170.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="BPMNShape_ExclusiveGateway_1" bpmnElement="ExclusiveGateway_1" isMarkerVisible="true"><dc:Bounds height="50.0" width="50.0" x="310.0" y="190.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="BPMNShape_ExclusiveGateway_2" bpmnElement="ExclusiveGateway_2" isMarkerVisible="true"><dc:Bounds height="50.0" width="50.0" x="650.0" y="200.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="BPMNShape_BusinessRuleTask_2" bpmnElement="BusinessRuleTask_2"><dc:Bounds height="50.0" width="110.0" x="460.0" y="90.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="BPMNShape_BusinessRuleTask_1" bpmnElement="BusinessRuleTask_1"><dc:Bounds height="50.0" width="110.0" x="450.0" y="310.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_1" bpmnElement="SequenceFlow_1" sourceElement="BPMNShape_StartEvent_1" targetElement="BPMNShape_ExclusiveGateway_1"><di:waypoint xsi:type="dc:Point" x="160.0" y="158.0"/><di:waypoint xsi:type="dc:Point" x="160.0" y="215.0"/><di:waypoint xsi:type="dc:Point" x="310.0" y="215.0"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_2" bpmnElement="SequenceFlow_2" sourceElement="BPMNShape_BusinessRuleTask_2" targetElement="BPMNShape_ExclusiveGateway_2"><di:waypoint xsi:type="dc:Point" x="570.0" y="115.0"/><di:waypoint xsi:type="dc:Point" x="675.0" y="115.0"/><di:waypoint xsi:type="dc:Point" x="675.0" y="200.0"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_3" bpmnElement="SequenceFlow_3" sourceElement="BPMNShape_ExclusiveGateway_1" targetElement="BPMNShape_BusinessRuleTask_2"><di:waypoint xsi:type="dc:Point" x="335.0" y="190.0"/><di:waypoint xsi:type="dc:Point" x="335.0" y="115.0"/><di:waypoint xsi:type="dc:Point" x="460.0" y="115.0"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_4" bpmnElement="SequenceFlow_4" sourceElement="BPMNShape_ExclusiveGateway_1" targetElement="BPMNShape_BusinessRuleTask_1"><di:waypoint xsi:type="dc:Point" x="335.0" y="241.0"/><di:waypoint xsi:type="dc:Point" x="335.0" y="335.0"/><di:waypoint xsi:type="dc:Point" x="450.0" y="335.0"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_5" bpmnElement="SequenceFlow_5" sourceElement="BPMNShape_BusinessRuleTask_1" targetElement="BPMNShape_ExclusiveGateway_2"><di:waypoint xsi:type="dc:Point" x="560.0" y="335.0"/><di:waypoint xsi:type="dc:Point" x="675.0" y="335.0"/><di:waypoint xsi:type="dc:Point" x="675.0" y="251.0"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_6" bpmnElement="SequenceFlow_6" sourceElement="BPMNShape_ExclusiveGateway_2" targetElement="BPMNShape_EndEvent_1"><di:waypoint xsi:type="dc:Point" x="701.0" y="225.0"/><di:waypoint xsi:type="dc:Point" x="808.0" y="225.0"/><di:waypoint xsi:type="dc:Point" x="808.0" y="206.0"/></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</bpmn2:definitions>

6.endEvent

定义流程的结束事件。常见的结束事件类型有完成、错误和取消。

示例

在这里插入图片描述

相关文章:

  • 7.8作业
  • 仪表板展示|DataEase看中国:2023年中国新能源汽车经济运行情况分析
  • vue3+ts 重复参数提取成方法多处调用以及字段无值时不传字段给后端
  • 2011年的数字IC设计面经
  • MySQL:left join 后用 on 还是 where?
  • 解决Linux中已安装JDK但是java找不到命令问题
  • matlab实现pid控制空调温度
  • 昇思25天学习打卡营第19天 | ResNet50迁移学习再续
  • 【JVM-04】线上CPU100%
  • wordpress外贸建站公司案例英文模板
  • Netty服务端接收TCP链接数据
  • 代码随想录算法训练营:28/60
  • JAVA中关于compareTo方法的原理深挖
  • 【论文阅读】AsyncDiff: Parallelizing Diffusion Models by Asynchronous Denoising
  • VS2019 因公司加密无法运行程序原因
  • [译]CSS 居中(Center)方法大合集
  • [译]如何构建服务器端web组件,为何要构建?
  • 【347天】每日项目总结系列085(2018.01.18)
  • Docker下部署自己的LNMP工作环境
  • GraphQL学习过程应该是这样的
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Markdown 语法简单说明
  • Theano - 导数
  • 给新手的新浪微博 SDK 集成教程【一】
  • 前端性能优化--懒加载和预加载
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 正则学习笔记
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #pragma预处理命令
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (2.2w字)前端单元测试之Jest详解篇
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (vue)页面文件上传获取:action地址
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (八)Spring源码解析:Spring MVC
  • (苍穹外卖)day03菜品管理
  • (超详细)语音信号处理之特征提取
  • (力扣)循环队列的实现与详解(C语言)
  • (六)c52学习之旅-独立按键
  • (三)mysql_MYSQL(三)
  • (一) storm的集群安装与配置
  • (一)kafka实战——kafka源码编译启动
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net SqlSugarHelper
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @PostConstruct 注解的方法用于资源的初始化
  • [100天算法】-目标和(day 79)
  • [20140403]查询是否产生日志