SpringBoot整合Activiti7—— 补偿边界/补偿中间事件(十五)

文章目录

  • 补偿边界/补偿中间事件
    • 代码实现
      • xml文件
      • 测试流程
      • 流程执行步骤


补偿边界/补偿中间事件

补偿事件可以被触发来回滚或修复之前已经完成的任务或活动。

补偿事件通常与错误边界事件(Error Boundary Event)结合使用。当任务或活动发生异常时,错误边界事件将被触发,进而触发相应的补偿事件。

补偿任务必须设置isForCompensation=true,否则报错。

<!-- 补偿边界事件 -->
<boundaryEvent id="sid-e212b29a-ee63-44e7-aa0d-dc3747d65292" name="补偿边界事件" attachedToRef="sid-27eea210-df9e-4d0f-baee-5e14af7fa0a5" cancelActivity="true">
  <compensateEventDefinition/>
</boundaryEvent>
<!-- 补偿中间事件-抛出 -->
<intermediateThrowEvent id="sid-d1d8eca9-f921-4e29-9112-2872519f0a3b" name="补偿中间事件">
  <compensateEventDefinition/>
</intermediateThrowEvent >
<!-- 虚线连接 -->
<association id="sid-ea9e367e-b7ed-46ed-9403-acea8418ffef" sourceRef="sid-e212b29a-ee63-44e7-aa0d-dc3747d65292" targetRef="sid-0cafc7be-15c3-403d-bbfc-b7ac67d2f768" associationDirection="None"/>

代码实现

在这里插入图片描述

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
  <!-- 定义错误 -->
  <error id="error1" name="errorCode1" errorCode="123456"/>
  <process id="compensate" name="补偿事件" isExecutable="true">
    <documentation>补偿事件流程</documentation>
    <!-- 开始事件 -->
    <startEvent id="sid-7dc3694c-934a-4d35-881b-70bbe4301fcf" name="开始事件"/>
    <!-- 钱包出账 -->
    <serviceTask id="sid-f12484f1-2a44-49c2-80b9-efcac32b9cf1" activiti:exclusive="true" activiti:delegateExpression="${myServiceTaskListener}" name="钱包出账"/>
    <sequenceFlow id="sid-383f9645-2666-4319-8f3a-60029387d412" sourceRef="sid-7dc3694c-934a-4d35-881b-70bbe4301fcf" targetRef="sid-f12484f1-2a44-49c2-80b9-efcac32b9cf1"/>
    <!-- 银行入账 -->
    <serviceTask id="sid-941a247c-a43b-44b7-bf2a-c4c6c1b97f99" activiti:exclusive="true" activiti:delegateExpression="${myServiceTaskListener}" name="银行入账"/>
    <sequenceFlow id="sid-05d783bf-185d-4220-83d8-ae2beccc79f4" sourceRef="sid-f12484f1-2a44-49c2-80b9-efcac32b9cf1" targetRef="sid-941a247c-a43b-44b7-bf2a-c4c6c1b97f99"/>
    <!-- 检验结果 -->
    <serviceTask id="sid-7ef12140-baa4-4bff-a229-74b368c49fd8" activiti:exclusive="true" activiti:delegateExpression="${myThrowErrorDelegateListener}" name="检验结果"/>
    <sequenceFlow id="sid-fc528896-5253-4ecd-814d-45b04e7675fb" sourceRef="sid-941a247c-a43b-44b7-bf2a-c4c6c1b97f99" targetRef="sid-7ef12140-baa4-4bff-a229-74b368c49fd8"/>
    <!-- 结束事件1 -->
    <endEvent id="sid-86a2c6a3-6e83-46c5-ae45-92820324b502" name="结束事件1"/>
    <sequenceFlow id="sid-798a901a-081f-477f-b370-16258ccf0e4b" sourceRef="sid-7ef12140-baa4-4bff-a229-74b368c49fd8" targetRef="sid-86a2c6a3-6e83-46c5-ae45-92820324b502"/>
    <!-- 错误边界事件 -->
    <boundaryEvent id="sid-e7576742-080e-4dda-9a8b-a6e5241906f0" attachedToRef="sid-7ef12140-baa4-4bff-a229-74b368c49fd8" name="错误边界事件">
      <errorEventDefinition errorRef="error1"/>
    </boundaryEvent>
    <!-- 补偿中间事件-抛出 -->
    <intermediateThrowEvent id="sid-d1d8eca9-f921-4e29-9112-2872519f0a3b" name="补偿中间事件">
      <compensateEventDefinition/>
    </intermediateThrowEvent >
    <sequenceFlow id="sid-2fdee7fd-7171-470e-8b7f-2c0c3f351d1d" sourceRef="sid-e7576742-080e-4dda-9a8b-a6e5241906f0" targetRef="sid-d1d8eca9-f921-4e29-9112-2872519f0a3b"/>
    <!-- 结束事件2 -->
    <endEvent id="sid-76f8e2ab-30a0-46df-8ede-819cee3fd3c4" name="结束事件2"/>
    <sequenceFlow id="sid-2435a8ad-769a-464b-8b17-4d8ccaa68db4" sourceRef="sid-d1d8eca9-f921-4e29-9112-2872519f0a3b" targetRef="sid-76f8e2ab-30a0-46df-8ede-819cee3fd3c4"/>
    <!-- 钱包补偿任务 -->
    <serviceTask id="sid-ae4a072e-bd85-4454-9450-a3e0982fbde4" activiti:exclusive="true" activiti:delegateExpression="${myServiceTaskListener}" isForCompensation="true" name="钱包补偿任务"/>
    <!-- 银行补偿任务 -->
    <serviceTask id="sid-2ea92408-adf6-474e-8d70-613f21dbf86a" activiti:exclusive="true" activiti:delegateExpression="${myServiceTaskListener}" isForCompensation="true" name="银行补偿任务"/>
    <!-- 补偿边界事件 -->
    <boundaryEvent id="sid-ad06646b-7513-4da5-98df-88a1f836fb52" attachedToRef="sid-f12484f1-2a44-49c2-80b9-efcac32b9cf1" name="钱包补偿边界事件">
      <compensateEventDefinition/>
    </boundaryEvent>
    <!-- 补偿边界事件 -->
    <boundaryEvent id="sid-eace335f-644a-48aa-8eab-a65ff4e7dc41" attachedToRef="sid-941a247c-a43b-44b7-bf2a-c4c6c1b97f99" name="银行补偿边界事件">
      <compensateEventDefinition/>
    </boundaryEvent>
    <!-- 虚线连接 -->
    <association id="sid-06dace8e-df61-4b33-b127-87ee5178795e" sourceRef="sid-ad06646b-7513-4da5-98df-88a1f836fb52" targetRef="sid-ae4a072e-bd85-4454-9450-a3e0982fbde4" associationDirection="None"/>
    <association id="sid-8be52165-0a91-4ad3-b173-f4eb80f36776" sourceRef="sid-eace335f-644a-48aa-8eab-a65ff4e7dc41" targetRef="sid-2ea92408-adf6-474e-8d70-613f21dbf86a" associationDirection="None"/>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_compensate">
    <bpmndi:BPMNPlane bpmnElement="compensate" id="BPMNPlane_compensate">
      <bpmndi:BPMNShape id="shape-6cb79578-6929-4743-a0a8-3259ccb657ea" bpmnElement="sid-7dc3694c-934a-4d35-881b-70bbe4301fcf">
        <omgdc:Bounds x="-266.1" y="-40.927986" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="shape-d4995e3e-2613-4758-99f1-6992db206f3d" bpmnElement="sid-f12484f1-2a44-49c2-80b9-efcac32b9cf1">
        <omgdc:Bounds x="-213.28398" y="-65.927986" width="100.0" height="80.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-87b1c4d7-e1fb-4c18-9fb9-14dcede6e55a" bpmnElement="sid-383f9645-2666-4319-8f3a-60029387d412">
        <omgdi:waypoint x="-236.1" y="-25.927986"/>
        <omgdi:waypoint x="-213.28398" y="-25.927986"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-4452552f-250a-4c44-b337-ed04ccc54199" bpmnElement="sid-941a247c-a43b-44b7-bf2a-c4c6c1b97f99">
        <omgdc:Bounds x="-87.28398" y="-65.927986" width="100.0" height="80.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-0cd7df69-4eb7-4321-9cb9-d08d44209f72" bpmnElement="sid-05d783bf-185d-4220-83d8-ae2beccc79f4">
        <omgdi:waypoint x="-113.28398" y="-25.927986"/>
        <omgdi:waypoint x="-87.28398" y="-25.927986"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-4ec3eacd-51c2-45ee-8db0-16c6dba5f15c" bpmnElement="sid-7ef12140-baa4-4bff-a229-74b368c49fd8">
        <omgdc:Bounds x="41.116028" y="-65.927986" width="100.0" height="80.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-d4331ebf-31c7-430a-b97f-84a8cc612fb1" bpmnElement="sid-fc528896-5253-4ecd-814d-45b04e7675fb">
        <omgdi:waypoint x="12.716019" y="-25.927986"/>
        <omgdi:waypoint x="41.116028" y="-25.927986"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-56e3283f-bf3c-4bd3-8c6c-07cb6bfe7f02" bpmnElement="sid-86a2c6a3-6e83-46c5-ae45-92820324b502">
        <omgdc:Bounds x="171.31602" y="-40.927986" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-634db270-5ae4-417b-99c2-f77af08657e7" bpmnElement="sid-798a901a-081f-477f-b370-16258ccf0e4b">
        <omgdi:waypoint x="141.11603" y="-25.927986"/>
        <omgdi:waypoint x="171.31602" y="-25.927986"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-4661ada5-3ad5-4e19-b9e5-b9164dcf6cdf" bpmnElement="sid-e7576742-080e-4dda-9a8b-a6e5241906f0">
        <omgdc:Bounds x="79.51603" y="-2.3279858" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="shape-58b658fe-6356-413f-9b3a-0be0fe39bccf" bpmnElement="sid-d1d8eca9-f921-4e29-9112-2872519f0a3b">
        <omgdc:Bounds x="90.51604" y="69.67202" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-0a0a0cf5-a146-43ac-bdc1-6c6498270b01" bpmnElement="sid-2fdee7fd-7171-470e-8b7f-2c0c3f351d1d">
        <omgdi:waypoint x="94.51603" y="27.672014"/>
        <omgdi:waypoint x="105.51604" y="69.67201"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-5643facb-06d8-4537-902b-f63664b4fa12" bpmnElement="sid-76f8e2ab-30a0-46df-8ede-819cee3fd3c4">
        <omgdc:Bounds x="154.516" y="69.67203" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-7a79b04b-ddbc-42f7-a734-0e24880a4659" bpmnElement="sid-2435a8ad-769a-464b-8b17-4d8ccaa68db4">
        <omgdi:waypoint x="120.51604" y="84.67202"/>
        <omgdi:waypoint x="154.516" y="84.67203"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-91c9ebe6-43e4-4c70-9a53-b97a39ff9010" bpmnElement="sid-ae4a072e-bd85-4454-9450-a3e0982fbde4">
        <omgdc:Bounds x="-225.88408" y="60.872017" width="103.0" height="47.6"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="sid-29019e4e-346b-423d-81b1-3045ea62a5e2" bpmnElement="sid-2ea92408-adf6-474e-8d70-613f21dbf86a">
        <omgdc:Bounds x="-88.78398" y="60.87201" width="103.0" height="47.6"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="shape-c3538e72-8fdc-49b1-89e5-376a19e09cac" bpmnElement="sid-ad06646b-7513-4da5-98df-88a1f836fb52">
        <omgdc:Bounds x="-183.28398" y="-4.12798" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="sid-9efddae1-fabd-4af6-9a34-0b690d8ee66e" bpmnElement="sid-eace335f-644a-48aa-8eab-a65ff4e7dc41">
        <omgdc:Bounds x="-55.483974" y="-1.7279825" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-f042fae5-8388-4e3a-9541-032c9023877e" bpmnElement="sid-06dace8e-df61-4b33-b127-87ee5178795e">
        <omgdi:waypoint x="-168.28398" y="25.87202"/>
        <omgdi:waypoint x="-174.38408" y="60.872013"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="edge-9df10eda-2955-45e8-9ca9-56c0192a1bfe" bpmnElement="sid-8be52165-0a91-4ad3-b173-f4eb80f36776">
        <omgdi:waypoint x="-40.483974" y="28.272018"/>
        <omgdi:waypoint x="-37.28398" y="60.872013"/>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

测试流程

@Test
public void deployAndStartProcess() {
    // 部署流程
    Deployment deploy = repositoryService.createDeployment()
            .addClasspathResource("processes/compensate.bpmn20.xml")
            .deploy();
    System.out.println("deploy = " + deploy);

    // 启动流程
    String processDefinitionKey = "compensate";
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, processDefinitionKey + ":1000001");
    System.out.println("processInstance = " + processInstance);
}

流程执行步骤

// 1.部署并启动流程
// 2.触发钱包服务任务、银行服务任务、检验结果服务任务
// 3.触发错误边界事件,抛出错误码,触发补偿中间事件
// 4.触发钱包补偿边界事件,并触发钱包补偿任务
// 5.触发银行补偿边界事件,并触发银行补偿任务
// 6.结束流程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/368529.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL sever2008中创建用户并赋权

一、创建数据库dream CREATE DATABASE dream; 二、创建登录用户XZS 法一&#xff1a;使用SSMS创建 通过查询 sys.syslogins 系统视图来确定当前登录是否具有系统管理员权限。执行以下查询语句&#xff1a; SELECT name, isntname FROM sys.syslogins WHERE sysadmin 1;选…

Android Studio从零基础到APP上线(3)

第3章 简单控件 本章介绍App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图,容纳视图的常用布局,响应点击的按钮控件,显示图片的图像视图等。然后结合本章所学的知识,演示一个实战项目“简单计算器”的设计与实现。 3.1 文本显示 本节介绍如何在文本视图Tex…

Jmeter,如何从数组参数中取值

有个post请求&#xff0c;参数“equipment_ids”&#xff0c;是个数组&#xff0c;需求每次执行的时候&#xff0c;按顺序取equipment_ids中不同的值 要实现在 JMeter 中每次执行请求时按顺序取不同的 equipment_ids 中的值&#xff0c;你可以使用 Counter 元件来生成索引&…

【面试深度解析】掌上先机后端面试(Java基础能力夯实)

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

HTML音频标签

新增的语义化的标签&#xff1a; 即直接给了一个具象化的盒子。 新增的多媒体标签&#xff1a; 视频格式&#xff1a; 当都不支持的时候会显示文字。 video仍然是可以看成一个盒子。 音频格式&#xff1a; 新增的input 表单控件&#xff1a; 新增的表单属性&#xff1a; 提示文…

MyBatis 的XML实现方法

MyBatis 的XML实现方法 MyBatis 的XML实现方法前情提示创建mapper接口添加配置创建xml文件操作数据库insert标签delete标签select标签resultMap标签 update标签sql标签,include标签 MyBatis 的XML实现方法 前情提示 关于mybatis的重要准备工作,请看MyBatis 的注解实现方法 创…

Java SWT Composite 绘画

Java SWT Composite 绘画 1 Java SWT2 Java 图形框架 AWT、Swing、SWT、JavaFX2.1 Java AWT (Abstract Window Toolkit)2.2 Java Swing2.3 Java SWT (Standard Widget Toolkit)2.4 Java JavaFX 3 比较和总结 1 Java SWT Java SWT&#xff08;Standard Widget Toolkit&#xff…

Power BI案例-链接Mysql方法

Power BI案例-连锁Mysql 方法1-通过组件mysql-connector-net-8.3.0&#xff1a; 选择文件–获取数据–选择MySQL数据库–选择链接 提示无组件&#xff0c;选择了解详细情况 弹出浏览器&#xff0c;选择下载 不用登陆&#xff0c;可以直接下载 下载的组件如下&#xff1a…

【开源】基于JAVA+Vue+SpringBoot的陕西非物质文化遗产网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…

代码随想录算法训练营Day46|139.单词拆分、多重背包理论基础、背包问题总结

目录 139.单词拆分 方法一&#xff1a;回溯法 算法实现 方法二&#xff1a;背包问题 算法实现 多重背包理论基础 思路 算法实现 背包问题总结 前言 背包递推公式 遍历顺序 0-1背包 完全背包 139.单词拆分 题目链接 文章链接 方法一&#xff1a;回溯法 在回溯专题…

Endnote常见设置(硕士毕业论文参考文献修改)

1、根据大多数期刊或学校使用的标准&#xff0c;英文名首字母大写后续字母小写。 2、需要手动调整Endnote中的参考文献相关内容 3、关于姓名大小写设置 AS IS是不更改大小写&#xff0c;EndNote库中文献的大小是什么样&#xff0c;Word中就显示什么样。选择Normal为首字母大…

HDMI2.1之eARC简介-Dolby Atmos和DTS:X

文章目录 eARC目的更大的带宽更高质量音频支持对象型音频与CEC&#xff08;Consumer Electronics Control&#xff09;的兼容性&#xff1a; 适应流媒体发展Dolby AtmosDTS:X高分辨率音频更高的音频位深度和采样率低延迟音频 对象型音频格式独立对象三维定位动态音场适应性和灵…

嵌入式——串行外围设备接口(SPI)

目录 一、初识SPI 1. 介绍 2. 特性 补&#xff1a; 二、物理层 1. SS &#xff08;Slave Select&#xff09; 2. SCK &#xff08;Serial Clock&#xff09; 3. MOSI &#xff08;Master Output, Slave Input&#xff09; 4. MISO &#xff08;Master Input&#xff0…

虚拟机Windows Server 2016 安装 MySQL8

目录 一、下载MySQL8 1.下载地址&#xff1a; 2.创建my.ini文件 二、安装步骤 第一步&#xff1a;命令窗口 第二步&#xff1a;切换目录 第三步&#xff1a;安装服务 第四步&#xff1a;生成临时密码 第五步&#xff1a;启动服务 第六步&#xff1a; 修改密码 三…

【Linux系统化学习】进程替换

目录 进程程序替换 替换原理 ​编辑替换函数 函数解释 命名理解 函数使用 execl execlp execv execvp 调用其它程序 进程程序替换 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个…

0203-2-输入输出系统

第六章&#xff1a;输入输出系统 I/O系统的功能&#xff0c;模型和接口 I/O系统管理的对象是I/O设备和相应的设备控制器。 I/O系统的基本功能 隐藏物理设备的细节与设备的无关性提高处理机和I/O设备的利用率对I/O设备进行控制确保对设备的正确共享错误处理 I/O软件的层次结…

重写Sylar基于协程的服务器(4、协程调度模块的设计)

重写Sylar基于协程的服务器&#xff08;4、协程调度模块的设计&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、日…

2.03作业

1.请编程实现单向循环链表的头插&#xff0c;头删&#xff0c;尾插&#xff0c;尾删。 2.请编程实现单向循环链表约瑟夫环 约瑟夫环&#xff1a;用循环链表编程实现约瑟夫问题 n个人围成一圈&#xff0c;&#xff0c;从某人开始报数&#xff0c;1,2&#xff0c;......,m,数到…

牛客-NC249946-小d和孤独的区间

牛客-小d和孤独的区间 题目如上 1 s 1s 1s的时间限制&#xff0c;说明我们应该找到一种“巧法” 根据提示&#xff0c;我们只需要找到“中间全部都是 0 0 0&#xff0c;只有一个1的区间”即可 但是在找的途中&#xff0c;我们不仅要顾及当前 1 1 1之前的 0 0 0的个数&#xff…

JProfiler for Mac:提升性能和诊断问题的终极工具

在当今的高性能计算和多线程应用中&#xff0c;性能优化和问题诊断是至关重要的。JProfiler for Mac 是一个强大的性能分析工具&#xff0c;旨在帮助开发者更好地理解其应用程序的运行情况&#xff0c;提升性能并快速诊断问题。 JProfiler for Mac 的主要特点包括&#xff1a;…