springboot + activiti实现activiti微服务化

news2025/1/11 2:21:46

概述

本文介绍如何将springboot+activiti进行整合,并配合eureka,zuul和feign实现activiti的微服务化,将流程控制和业务逻辑分离. 并实现了几个比较特殊的功能,比如时间段委托(某人请假或出差,出差时间内,所有待办交给被委托人处理),比如节点的无限级加签功能(流程本身有不确定性,临时增加审核人)

详细

一、分析流程

整理了一下整个流程,共分以下四个步骤:

1.首先进行springboot2.x和activiti的整合。

    注1:整合不需要太多的操作,只需引入指定pom索引,并简单添加配置就能直接使用;
    注2:整合包括了activiti的模型编辑插件activiti-moleder的整合和简单修改;
    注3:附件中存在几个可以直接运行的bpmn文件,分别对应了几个功能

2.添加eureka-server和zuul,并创建一个工作流功能的使用者,使用feign对activiti的暴露方法进行访问实现流程流转,将核心功能和流转功能分开,核心功能自己保留,流转功能以接口的方式暴露,实现activiti的微服务化。

    注1:流程使用者需要自己编写对应的业务流程,工作流模块只负责流程管理,将业务和流程控制最大限度解耦分离。
    注2:核心功能包括模型创建,编辑,定义,导出,用户用户组的整合;
    注3:流转功能包括提交,完成,查询流程变量,获取流程自定义表单,获取待办已办事项等;

3.实现时间段委托功能

    注1:例如某人需要请假或者出差,请假出差期内,他的所有待办事项将交于被委托人处理。
    注2:一旦委托,将只有被委托人可以看到任务,委托人将失去该任务的审核权限(待完善);
    注3:只能实现办理人和候选人的委托,候选组内人员的委托未实现;
    注4:实现方法是通过全局事件监听器对用户实体创建的时间进行监听,然后修改

4.实现节点的无限级加签

    注1:功能有些变态,因为个人理解,如果业务部门没有固定的流程,没有必要使用工作流引擎,手写流程他不香吗?
    注2:限制比较高,需要用户任务节点使用多实例串行类型;
    注3:加签的实现方式有很多,有手动增加节点,并持久化(持久化是为了日志),有多实例任务加签(非串行)等,这里只实现了串行多实例加签;

5.实现节点的自定义表单

    注1:自定义表单分为内置表单和外置表单,一个保存字段信息,一个保存的是外部制作好的表单的key
    注2:本demo只实现了内置表单,即字段信息保存;
    注3:这种方法需要前端拿到字段之后,进行手动渲染;

二、具体实现过程及问题解决

第一步:

1.创建springboot项目,引入activiti的pom索引,以及配置文件;

pom.xml

注意:这里有个坑,使用tk.mybatis和activiti整合的伙伴注意了,要将这个排除

application.yml

然后直接运行会发现数据库中多了二十多张表

2.整合activiti-modeler:

先导入activiti-modeler的端文件

在传入必要的activiti的几个配置以及接口(必要接口,附件中有这里就不贴了,图片太多了影响阅读)

3.到此集成结束,正常的话可以直接运行,这是需要自行解决前端问题,最终结果如下:


 

成功!第一步结束!

第二步:

1.创建工作流任务使用者,并使用eureka,zuul以及feign进行微服务调用

如果需要查看eureka+zuul+feign的使用,请移步至springboot+eureka+zuul 完整demo
创建一个新的模块和activiti模块平级,这个模块包含具体的业务和流转服务接口的调用

具体业务代码

feign代码

具体的页面和请假业务需要自己编写,最终结果如下

没有实现登录功能,使用下拉框模拟待办事项的当前登录人

第二步骤结束

第三步:

1.实现全局的时间段委托功能

首先添加委托功能的CRUD,根据自己的业务去定义

定义一个activiti的全局事件监听器,并注册到springboot中

在事件监听器中,监听实体创建时间,并判断当前实体是否为 IdentityLinkEntity ,且是用户,则修改办理人

成功!第三步结束!

第四步:

1.实现节点的无限级加签

首先修改模型

再修改自定义表单属性

最后修改代码,如果需要加签,在act_ru_variables表中修改办理人集合和实例总数即可实现加签,加签后返回,其实是在最后一个节点审批的时候,再加签给第一个办理人

第五步:

1.自定义表单的实现

首先在一个用户任务节点配置字段

后台取出保存的字段,并返回前端手动渲染


 


 

最终结果如下

至此,全部结束,项目最终结构如下,具体实现在demo,demo可直接运行,并包含几个模型文件,可以直接使用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法非常简单

php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法,主要使用到了 php 的时间函数 mktime。下面首先还是以示例说明如何使用 mktime 获取今日、昨日、上周、本月的起始时间戳和结束时间戳,然后在介绍一下 mktime 函数作用和用法。非常简单哦…

vue3组件通信学习笔记

1、Prop 父组件 <template><div class"parent"><h1>我是父元素</h1><Child :msg"msg"></Child></div> </template><script setup> import Child from ./Child.vue let msg ref(我是父组件的数据…

单片机采集传感器数据(整形,浮点型)modbus上传

浮点型数据 占两个寄存器&#xff08;四个字节&#xff09; short 整形 占一个寄存器 &#xff08;两个字节&#xff09; 注意&#xff01;&#xff01;&#xff01;&#xff01; stm32 是小端模式&#xff0c;而modbus解析数据是大端模式 所以先发送高字节 如int a16777220…

【QML】使用 QtQuick2的ListView创建一个列表(一)

qtquick2版本和qtquick1版本分别提供了一个ListView组件供使用&#xff0c;两个组件在使用上和属性的提供上还是有比较大的差异的&#xff0c;因为qtquick2是新的&#xff0c;所以就以改版本为基础学习如何使用&#xff1b; 首先&#xff0c;要知道ListView提供了那些属性提供修…

2023年智能家居占消费电子出货量28%,蓝牙Mesh照明占据重要位置

市场研究机构 TechInsights 的最新报告显示&#xff0c;预计 2023 年全球消费者在智能家居相关硬件、服务和安装费方面的支出将复苏&#xff0c;达到 1310 亿美元&#xff0c;比 2022 年增长 10%。TechInsights 表示&#xff0c;消费者在智能家居系统和服务上的支出将继续强劲增…

【UIPickerView案例05-省市选择界面数据展示 Objective-C语言】

一、省市选择界面数据展示 1.省市选择界面数据展示,就是这样的一个东西 我们接下来,看我们第二个案例,就是这个省市选择, 左边选择一个省,右边就把这个省所有的市展示出来 比如,我现在展示的是山东的城市, 我选择一个山西 第一步干嘛,是不是也是分析它的界面 1)上…

Android Automotive编译

系统准备 安装系统 准备一台安装Ubuntu系统的机器&#xff08;windows系统的机器可以通过WSL安装ubuntu系统&#xff09; 安装docker 本文使用docker进行编译&#xff0c;因此提前安装docker。参考网络链接安装docker并设置为不使用sudo进行docker操作。 参考链接&#xff…

B-Tree 索引和 Hash 索引的对比

分析&回答 B-Tree 索引的特点 B-tree 索引可以用于使用 , >, >, <, < 或者 BETWEEN 运算符的列比较。如果 LIKE 的参数是一个没有以通配符起始的常量字符串的话也可以使用这种索引。 有时&#xff0c;即使有索引可以使用&#xff0c;MySQL 也不使用任何索引。…

2023 最新 Git 分布式版本控制系统介绍和下载安装使用教程

Git 基本概述 Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或大或小的项目。 集中式和分布式的区别&#xff1f; 最常见的集中式版本控制系统是SVN&#xff0c;版本库是集中放在中央处理器中的&#xff0c;而干活的时候&#xff0c;用的都是自己电…

类和对象(Java)

目录 一、面向对象的初步认知1、什么是面向对象2、面向对象与面向过程 二、类和类的实例化1、什么是类2、类的实例化3、类和对象的说明 三、this引用1、为什么要有this引用2、什么是this引用3、this引用的特性 四、对象的构造及初始化1、如何初始化对象2、构造方法 五、封装1、…

React三属性之:props

作用 将父组件的参数传递给子组件 父组件 import ./App.css; import React from react; import PropsTest from ./pages/propsTest class App extends React.Component{render(){return(<div><h2>App组件</h2><PropsTest obj{{name:王惊涛,age:27}}>…

首发丨全球首款用于激光雷达的商用光控超表面芯片发布!激光雷达降本再添可选项

《激光雷达老炮儿》最新获悉,美国光学半导体创业公司Lumotive于上周五宣布正式对外推出其首款极具开创性、基于光控超表面 (LCM)技术的完整产品LM10,该产品也是世界上首款商用数字光束控制解决方案。 与机械系统相比,Lumotive的数字光束控制技术凭借其卓越的成本、尺寸和可…

基于Python机器学习、深度学习提升气象、海洋、水文应用教程

详情点击链接&#xff1a;基于Python机器学习、深度学习提升气象、海洋、水文应用教程 前沿 Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。除了标准…

vue 分页器组件+css动画效果

全网都找了一遍没有找到符合UI需求的分页动画&#xff0c;于是就主动上手了 需求&#xff1a; 1、分页最多显示9页&#xff0c;总页数最多显示无上限&#xff1b; 2、点击下一页的时候需要有动画效果过度&#xff0c;如果当前页数是当前显示最后的一页&#xff0c;则停了当前…

文件上传漏洞-upload靶场17-20关

文件上传漏洞-upload靶场17-20关 简介 经过了图片木马的的几个关卡&#xff0c;了解到如何使用图片写入代码的方式&#xff0c;去上传webshell。它们相较于修改后缀的方式&#xff0c;复杂度升级&#xff0c;需要去了解每一种图片类型的编码&#xff0c;可以在图片中去写入&a…

c++ noexcept

引入noexcept原因&#xff1a; 异常规范的检查是在运行期而不是编译期&#xff0c;因此程序员不能保证所有异常都得到了 catch 处理。由于第一点的存在&#xff0c;编译器需要生成额外的代码&#xff0c;在一定程度上妨碍了优化。模板函数中无法使用。赋值函数、拷贝构造函数和…

stable diffusion webui中的sampler

Stable Diffusion-采样器篇 - 知乎采样器&#xff1a;Stable Diffusion的webUI中&#xff0c;提供了大量的采样器供我们选择&#xff0c;例如Eular a&#xff0c; Heum&#xff0c;DDIM等&#xff0c;不同的采样器之间究竟有什么区别&#xff0c;在操作时又该如何进行选择&…

云备份——服务器业务处理模块以及网络通信模块

我们这里由于网络通信模块借助httplib库来完成&#xff0c;因此两个模块合并到一起完成&#xff0c;不熟悉httplib库的老铁可以再看看我之前的文章 云备份——第三方库使用介绍&#xff08;下&#xff09;_爱吃鱼的修猫的博客-CSDN博客 一&#xff0c;业务处理模块设计 我们这里…

移动安全:保护移动设备的 6 种方法

什么是移动安全&#xff1f; 移动安全是一个广泛的术语&#xff0c;涵盖用于保护移动设备上存储和传输的个人和商业信息的所有措施和技术。 移动安全可分为三个关键领域&#xff1a; 物理安全&#xff1a;保护设备本身免遭盗窃或损坏。 软件安全&#xff1a;通常通过使用…

【算法训练-链表 四】【删除】:删除链表的倒数第N个节点、删除有序链表中的重复元素、删除有序链表中的重复元素II

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【删除有序链表中的重复元素】&#xff0c;使用【链表】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c…