一、传统工作流完成方式
在没有专门的工作流引擎之前,我们之前为了实现流程控制,通常的做法就是采用状态字段的值来跟踪流程的变化情况。这样不用角色的用户,通过状态字段的取值来决定记录是否显示。比如说员工请假申请流程:员工申请---部门经理---总经理---人事存档
针对有权限可以查看的记录,当前用户根据自己的角色来决定审批是否合格的操作。如果合格将状态字段设置一个值,来代表合格;当然如果不合格也需要设置一个值来代表不合格的情况。
这是一种最为原始的方式。通过状态字段虽然做到了流程控制,但是当我们的流程发生变更的时候,这种方式所编写的代码也要进行调整。那么有没有专业的方式来实现工作流的管理呢?并且可以做到业务流程变化之后,我们的程序可以不用改变,如果可以实现这样的效果,那么我们的业务系统的适应能力就得到了极大提升。
二、Activiti流程
为什么Activiti就可以解决业务需求变更时,源代码不需要更新,更新的是业务流程图,原理是什么?
原理分析
如何可以做到我们在业务流程发生变更后,我们的业务系统代码可以不发生改变?此时我们就来分析一下原理。
具体分析过程如下图所示:
Activiti 内部核心机制及实现原理图
原理:节点和表之间的信息转换,关键点就在这里。把节点的信息读取出来然后存入到表里边,将来在处理的时候,从表中读取记录,处理完之后将记录删掉,意味着这个环节就处理完了,然后再处理下一个节点。
Activiti介绍
Activiti 是一个工作流引擎, activiti 可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言(BPMN2.0)进行定义,业务系统按照预先定义的流程进行执行,实现了业务系统的业务流程由 activiti 进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。
官方网站:https://www.activiti.org/
Activiti7默认 25 张表,公司开发的软件是否适合使用activiti。
BPMN
BPMN(Business Process Model And Notation)
- 业务流程模型和符号 是由 BPMI(Business Process Management Initiative)开发的一套标准的业务流程建模符号,使用 BPMN 提供的符号可以创建业务流程。
BPMN 主要用来规范化业务流程及统一建模。
Event 用一个圆圈表示,它是流程中运行过程中发生的事情。
活动用圆角矩形表示,一个流程由一个活动或多个活动组成:
一个 bpmn 图形的例子:
- 首先当事人发起一个请假单;
- 其次他所在部门的经理对请假单进行审核;
- 然后人事经理进行复核并进行备案;
- 最后请假流程结束
Bpmn 图形其实是通过 xml 表示业务流程,上边的.bpmn 文件使用文本编辑器打开:
<?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/test">
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="创建请假单"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1"
targetRef="usertask1"></sequenceFlow>
<userTask id="usertask2" name="部门经理审核"></userTask>
<sequenceFlow id="flow2" sourceRef="usertask1"
targetRef="usertask2"></sequenceFlow>
<userTask id="usertask3" name="人事复核"></userTask>
<sequenceFlow id="flow3" sourceRef="usertask2"
targetRef="usertask3"></sequenceFlow>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow4" sourceRef="usertask3"
targetRef="endevent1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
<bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="130.0"
y="160.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="210.0"
y="150.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
<omgdc:Bounds height="55.0" width="105.0" x="360.0"
y="150.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
<omgdc:Bounds height="55.0" width="105.0" x="510.0"
y="150.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="660.0"
y="160.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="165.0" y="177.0"></omgdi:waypoint>
<omgdi:waypoint x="210.0" y="177.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="315.0" y="177.0"></omgdi:waypoint>
<omgdi:waypoint x="360.0" y="177.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
<omgdi:waypoint x="465.0" y="177.0"></omgdi:waypoint>
<omgdi:waypoint x="510.0" y="177.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
<omgdi:waypoint x="615.0" y="177.0"></omgdi:waypoint>
<omgdi:waypoint x="660.0" y="177.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
三、Activiti使用
1、Activiti7整合开发步骤
- 1、整合Activiti
- 2、实现业务流程建模,使用BPMN实现业务流程图
- 3、部署业务流程到Activiti
- 4、启动流程实例
- 5、查询待办任务
- 6、处理待办任务
- 7、结束流程
2、开发环境
Activiti7.0.0Beta1
3、IDEA安装actiBPM
我按照教程打开settings-plugins,搜索actiBPM搜索不到,
于是我就去下载插件,然后再安装,具体步骤如下:
下载插件:
到http://plugins.jetbrains.com/,搜索需要的插件。
下载完毕,
进行安装,打开IDEA,settings--->plugins
:
导入插件之后,然后重启:
4、actiBPM使用
上一步在IDEA安装好 actiBPM
插件后,怎么使用呢?其实很简单:
New->BPMN file
创建一个 bpmn文件:
创建好之后,在IDEA显示业务流程模型和标识:
设计一个简单的请假流程图:
5、小结
为什么使用activiti可以实现代码不变更,就可以实现流程更新?
答:流程定义图做更新->先读取节点信息到数据库表中->后续就针对数据库表进行操作
25张表的创建,activiti要能够工作,就必须有表结构的支撑。
使用Java代码方式来生成25张表:
- 1.pom.xml文件需要引入activiti7开发相关的坐标
- 2.log4j.properties日志文件添加
- 3.activiti.cfg.xm配置文件,也可以是其它名称
配置数据源
创建ProcessEnginConfiguration对象 - 4.写Java代码
ProcessEnginConfiguration类
ProcessEngine类
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。