admin 管理员组文章数量: 1184232
2024年3月20日发(作者:数据库都有哪些)
第29卷
Vol.29
第11期
No.11
电子设计工程
ElectronicDesignEngineering
2021年6月
Jun.2021
Activiti工作流框架在OA系统中的应用
杨光
(西安庆安航空电子有限公司信息开发室,陕西西安710077)
摘要:针对OA系统中复杂的业务流程和流程流转过程中人员及角色的复杂关系,采用了Activiti
工作流框架,通过对框架中的身份信息数据表进行重构,并结合面向切面的SpringAOP及非关系型
数据库Redis,可以同时将流程任务的执行人分配给单人、人员列表、角色。在用户发起流程和处理
流程时,使用异步的处理方式,先行向Redis写入任务列表中有变化的人员列表,再使用定时任务,
每隔1s从Redis的人员列表中查询其任务列表并存入Redis。通过请求及响应测试表明,人员的待
办和已办任务列表查看时间可以降低至45ms以内。
关键词:OA系统;工作流框架;Activiti;Java;Redis
中图分类号:TP311文献标识码:A文章编号:1674-6236(2021)11-0065-05
DOI:10.14022/1674-6236.2021.11.014
TheapplicationofActivitiworkflowinOAsystem
YANGGuang
China)
Abstract:AsthecomplicatedbusinessprocessesandrelationsofpersonsandrolesinOAsystem,
ructuringofidentitydatabasetablesandusing
Whenusersstartaprocessand
SpringAOPandRedis,thetasksofprocessescanbeassignedtosingleperson,listofpersonsandroles.
escheduledtaskisusedto
durationofdisplayingthetodotasklistandthefinishedtasklistcanbedecreasedbelow45ms.
Keywords:OAsystem;workflowstructure;Activiti;Java;Redis
现代企业的办公自动化OA系统具有复杂的
流程审签业务,以公文审签为例,起草人员编写公
文,部门负责人审核,公司领导批准后,公文会下发
到各个部门和员工。若审批人员不同意,则可以
驳回流程,在起草人员修改后重新发起流程,进入
审批状态。
在传统的工作流中,任务的指派人员角色单一,
只能按照人员或角色指派任务。随着人员或角色的
复杂度的逐步提高,单一指派任务的方式已经不能
收稿日期:2021-03-03稿件编号:202103029
(DepartmentofInformationDevelopment,Xi’anQing’anAviationElectronicsCo.,Ltd.,Xi’an710077,
executetheirtasks,t
ingtothetestofrequestandresponsetime,the
完全满足系统的需要。文中在任务单一指派的基础
上,提出了重构人员身份数据表的方法,可以将任务
同时按人员或角色指派,提高了系统的灵活性。
1Activiti的技术特点
1.1工作流引擎ProcessEngine
工作流引擎ProcessEngine类是Activiti框架的
核心类,通过它可以获得Activiti所需的所有Service
类,以及生成流程运行时的各种实例、数据、监控以
及管理流程的正常运行
[1]
。
作者简介:杨光(1989—),男,陕西西安人,工程师。研究方向:工作流框架在大型信息化系统中的应用,
jeecg-boot框架在ERP系统中的应用。
-65-
《电子设计工程》2021年第11期
官方API提供了多种获取ProcessEngine的方
法,这里使用名为的配置文件来获取,
如图1所示
[2]
。
图1工作流引擎的配置文件
1.2各Service类
通过ProcessEngine对象可以生成各个Service
类,各类的作用如表1所示。
表1各Service类及作用
RepositoryService
Service类
作用
管理流程定义
RuntimeService
执行管理,包括启动、推进、删除
流程实例等操作
任务管理
HistoryService
TaskService
历史管理
IdentityService
组织机构管理
FormService(可选服务)任务表单管理
1.3BPMN
业务流程建模与标注(BusinessProcessModeland
Notation
组合成一
,BPMN
个业
)
务
是描述流程的基本符号,
流程图(BusinessProcess
包括图元
Diagram)
的方式
[3]
,如图2所示。
图2描述流程的基本符号
简单方法,
IDE安装
绘制的流程图是后缀名为
Activiti插件后,可以提供绘制流程的
bpmn的文件,
这类文件本质上是一个xml格式的文件
[4]
。
在xml格式文件中,包含代表各类元素的标签。
IDE
的文件。流程图中各个基本符号的属性都可以转换
提供绘制流程图的方式,可以自动生成xml格式
为xml文件中的各类标签和标签的属性
[5]
。
1.4
以act_
Activiti
数据库
开头,
的后台有数据库的支持,
表名的第二部分是表示表用途的两个
所有的表名都
字母标识,用途与服务的API对应
[6]
。
-66-
2数据库的二次开发
2.1
Activiti
数据库
信息表)、
的组织机构表包括
act_id_info(用户
act_id_group
扩展信息
(用户组
表)、
act_id_membership
act_id_user
(用户与用户组对应信息表)、
鉴于OA
(用户信息表)
系统部门、人员、
。
角色关系的复杂性,这
4
色关系的要求,
张表不能完全满足
因此需要调整表的结构或者重新设
OA系统对用户、人员、部门、角
计表。部门表可以使用act_id_group表,并补充相应
字段。用户表可以使用act_id_user,再增加人员表
person_info
membership
,
人员id、部门
可以作为人员
与用户表建
id、角色code、
-
立
角色名称等字段,
部门
关
-
联
角色表,
关系。
通过补充
act_id_
可以体
现人员所在部门及人员在该部门的角色。通过这种
方式,可以很好地对Activiti组织机构表进行重构,
以满足OA系统复杂的用户、人员、部门、角色、权限
等要求
[8]
。
2.2二次开发后的兼容性
进行数据库的二次开发以后,由于没有破坏原
有的数据表结构,因此在流程中可以使用调整后的数
据库结构进行处理,包括流程变量、个人任务、组任
务。所以二次开发可以完全兼容原数据库及方法。
3业务描述和流程图绘制
3.1业务描述
在OA系统进行文件分发时,首先由起草人编写
文件,编写完成后,部门负责人进行审核。如果部门
负责人及后续的公司领导均审批通过,则根据公文
的分发范围进行分发;如果审批不通过,则直接退回
到起草人阶段重新编写。
3.2流程图绘制
使用Eclipse的Activiti插件绘制公文审签流程
图,如图3所示。
为了满足OA系统越来越复杂的人员和角色设
计,文中提出了可以分别按照人员和角色分配任务
的方法。
在部门负责人审核任务中,由于起草人分属不
同的部门,所以部门负责人是变量,设置属性中的
Assignee
人。在起草人编写任务完成时,
为变量${deptLeaderId},且部门负责人是单
根据该人员查询所
杨光Activiti工作流框架在OA系统中的应用
图3公文审签流程图
在部门的负责人id,将流程变量设置为部门负责人
id,下一步的任务处理人即为部门负责人,如图4所示。
图4部门负责人审核任务的属性
在公司领导审批任务中,审批人为公司领导的
角色,与流程发起人无关。因此,可以直接将公司领
导审批任务的属性Candidategroups设置为company
Leader角色,如图5所示。
图5公司领导审批任务的属性
4关键代码设计
4.1部署流程定义
首先使用Spring框架注入流程引擎Process
Engine
并通过
的实例,
仓库Service
其次通过流程引擎创建仓库
创建部署对象
[9]
。通过
Service
部署对
,
象可以加载流程图,并为流程图指定名称,如图6
所示。
4.2启动流程实例
通过runtimeService启动流程实例,流程实例启
动后会生成流程实例id(processInstanceId),该数据
会伴随流程执行的整个过程,如图7所示。
图6部署流程定义
图7启动流程实例
4.3任务的完成
完成任务有多种方法,其中之一是使用taskService
的complete方法。如图8所示,首先可以查询出任务
的id,其次使用taskService的complete方法,传入参
数任务id,即可将任务完成。完成任务后,观察数据
库可以发现,历史表中会出现该任务的信息,而正在
执行的表中该任务会消失。
图8任务完成
4.4待办和已办的列表查询
对于待办和已办列表的查询,文中提出了同
时根据人员id和角色id查询,合并查询结果集的
方法。
以待办列表的查询为例,若人员id为“RY00001”,
需要查询该人员的待办列表,则按照以下步骤,如
图9所示。
Query().taskAssignee("RY00001").list()
1)使用kService().createTask
任务taskList1。
语句获得个人
的id
2
为
)根据人员的
"JS00001",使用
id可以查询其所属的角色,
kService
角色
().createTaskQuery().taskCandidateGroup("JS00001").
list()语句获得个人任务
任务
3)
2
使用
合并
List
,即
的
可
addAll
taskList2
得到
方法,
该人员
将个人任务
。
的任务,
1
taskList=
与个人
(taskList2)。
-67-
《电子设计工程》2021年第11期
图9查询任务
4.5任务列表的性能优化
使用上述方法查询人员的任务列表时,由于需
要将2个以上的List合并,且无法根据分页进行查
询,所以任务数量会增加,从而导致数据重组的速率
下降,影响系统性能
[10]
。经过实验得出,当一个人员
具有3个角色,且个人任务为7条,第一个角色的任
务为4条,第二个角色的任务为6条,第三个角色的
任务为3条,将3类任务进行合并,并进行数据重组
时,查询耗时为4718ms,已经超过了用户的可忍受
等待时间,影响了用户的体验,如图10所示。
图10任务列表查询时间
使用面向切面的编程SpringAOP以及非关系型
数据库Redis可以有效地解决这个问题
[11]
,具体如下
所示:
成任务时,
1)使用
使用后置增强获取人员
SpringAOP面向切面编
id
程
。利用切面来
,每次用户完
完成获取人员id并将人员的任务存入Redis缓存。利
用SpringAOP的目的是使得将任务存入Redis的操
作与业务进行解耦。首先定义切面类TaskAspect,
在切面类中定义切面的增强类型是后置增强
@After
在该方法中,
,后置增强的方法是
查询出该人员的待办和已办任务
*com.*.taskExecute(..)。
列表,并将其序列化为JSON字符串
[12]
。
和已
2
办
)使用
任务
Java
列表
调用
的JSON
Redis
字
的
符
API
串存
,将该人员的待办
入Redis中。其
中,key可以是人员的id+任务类型(已办和待办),
value可以是任务列表的JSON字符串。
接从
3
Redis
)每次查询人员的待办和已办任务列表时,
中取值,并反序列化为任务列表
[13-14]
。
直
由于Redis是非关系型数据库,适合于作为缓
存,读取速度快,因此,从Redis取值查询人员的待办
-68-
和已办列表时,可以有效降低查询时间
[15-20]
。
实验表明,使用Redis作为缓存,在相同的查询
条件下,可以将任务的查询时间从4718ms降低至
43ms,如图11所示。
图11从Redis缓存中查询任务列表时间
法,可
4)
以
使用
有效
Redis
降低
缓存任务列表的
查询已办和待办
JSON
任务
字符串的方
列表的时
间。然而,这样会引入另一个问题,当用户发起流程
或者处理流程时,由于需要将用户的已办和待办任
务列表全部查出,并序列化为JSON字符串,存入
Redis
和转换的时间也会增加,
,因此当用户的任务列表数据量过大时,
这样导致用户点击发起流
查询
程按钮或点击审批流程按钮时,会产生长时间的等
待,如图12所示。
图12用户操作时将任务列表缓存入Redis的时间
实验表明,在相同的条件下,当用户操作时,直
接将任务列表缓存入Redis,会导致用户的等待时间
为3209ms,带来了不良的操作体验。
针对出现的此问题,文中提出了如下解决方式:
首先修改用户操作后将任务列表缓存入Redis
的方式,从同步修改为异步。当用户操作时,仍然使
用SpringAOP面向切面编程,此时将执行操作的用
户id及操作类型存入Redis缓存。由于获取用户id
及操作类型的耗时极短,因此用户发起流程和完成
任务的操作需要极短的时间,操作后会在Redis中形
成操作用户的队列。
操作用户的队列采用“FIFO+定时任务”的方式,
每隔1s从Redis中取出任务列表有变化的用户id,
将该用户对应的任务列表查询出来,并序列化后存
入Redis缓存。通过这种方式,将查询任务列表的时
间放在了后台,提升了用户的体验。
以SpringBoot的定时任务为例来说明定时任务
的实现方法。
杨光Activiti工作流框架在OA系统中的应用
首先在SpringBoot的启动类上增加@Enable
Scheduling
执行定时任务方法的类上增加注解
的注解,用来启动定时任务;
@Component
之后,在需要
,纳
入容器进行管理;通过cron表达式可以定义多种形
式的定时任务,每隔1s执行一次,在需要执行定时
任务的方法上增加注解@Scheduled(cron="*/1***
*
Redis
?")。
中取出任务列表有变化的用户
这个定时任务的方法所完成
id
的
队列的队头,
功能就是从
并且将该用户的任务列表查询出来,序列化后存入
Redis
式,可以将用户操作时等待的时间转化为后台执行
,最后将该用户从队列中删除。通过这种方
程序的时间,提高用户的体验。
实验表明,在相同条件下,使用异步的方式,可
以将用户操作等待时间从3209ms降低为36ms,性
能提高了两个数量级,如图13所示。
图13用户操作时将用户id缓存入Redis的时间
5结论
文中研究了Activiti工作流框架在OA系统中的
应用,提出了重构人员身份数据表的方法和同时根据
人员和角色进行工作流的流转方法,并优化了待办和
已办任务列表的查询。通过这些研究,可以使得复
杂信息化系统中的工作流配置更加灵活,同时使得
待办和已办任务列表的查询效率大幅提高。该研究
对于构建大型流程信息化系统具有一定的实际意义。
参考文献:
[1]曾翔.基于Activiti工作流框架和WebService的
[2]欧盛芬
2017.
运行管理系统的设计与实现[D].南昌:南昌大学,
的电务生产管理平台设计与实现
,阳亦斌,杨将,等.基于Activiti
[J].
工作流引擎
铁路通信信
[3]张刚
号工程技术,2020(6):50-55.
公车申请业务的设计与实现
.基于SpringMVC框架和Activiti
[D].常州
流程引擎的
:常州信息
[4]江东明
职业技术学院
,薛锦云
,2020.
机制.[J].计算机科学
.基于
,2020,41(8):50-54.
BPMN的Web服务并发交互
[5]丁苍峰
与设计
.
[J].
基于
电子设计工程
MVC架构的轻量级工作流引擎研究
[6]薛辉.工作流管理技术分析
,2018(10):212-213
应用,2019(11):313-315.
[J].计算机光盘软件与
[7]胡奇
工业出版社
.jBPM4
,2018.
工作流应用开发指南[M].北京:电子
[8]庞伟林,阮俊杰.基于Activiti工作流框架的合理
[9]孙雨升
25(24):125-128.
化建议系统设计与实现[J].电子设计工程,2017,
与实现
.
[D].
基于工作流的科研绩效考核系统的设计
[10]朱运乔.基于
沈阳
SSM
:沈阳工业大学
框架的Web应用系统搭建与实
,2018.
[11]黄裕
现[J].
.基于分布式
电脑编程技巧与维护,2019(10):34-37.
究[J].计算机与数字工程
Redis集群的
,2018(10):49-67.
WEB共享管理研
[12]韦立
策略研究
,陈珊珊
[J].
.
计算机技术与发展
基于Redis单位最大效益自适应迁移
[13]李彦辰,艾庆忠,王少非.基于Redis
,2018(10):45-76.
的分布式搜索
[14]娄锋
引擎研究[J].软件导刊,2018(3):34-65.
机技术与发展
,孙涌.轻量级
,2017,17(1):12-45.
IoC容器的研究与设计[J].计算
[15]刘荣辉
设计[J].
,
计算机应用与软件
薛冰.基于Annotation
,2019(9):56-78.
的SpringAOP系统
[16]张哲
号统计系统设计
,王荣,温伟鸽
[J].
.基于SSM框架整合的工服报
[17]郭鹏
45-87.
电脑知识与技术,2018(15):
线宽关键尺寸的蒙特卡罗模拟
,缪泓,邹艳波,等.基于模型数据库对半导体
2020(1):46-53.
[J].现代应用物理,
[18]杨永娇
应用[J].
.ORACLE
自动化与仪器仪表
数据库自动化碎片整理研究与
[19]杨天敏.基于Access数据库的图像采集与实时处
,2019(8):223-226.
[20]张冰雪
理系统设计
,刘婷婷
[J].现代电子技术
,汤亚宸,等.基于图数据库的电力
,2021(3):35-38.
设备全生命周期管理技术研究[J].电力信息与通
信技术,2019(3):1-7.
-69-
版权声明:本文标题:Activiti工作流框架在OA系统中的应用 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1710949442a581015.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论