在没有专门的工做流引擎以前,咱们以前为了实现流程控制,一般的作法就是采用状态字段的值来跟踪流程的变化状况。这样不用角色的用户,经过状态字段的取值来决定记录是否显示。好比说员工请假申请流程:员工申请---部门经理---总经理---人事存档
express
针对有权限能够查看的记录,当前用户根据本身的角色来决定审批是否合格的操做。若是合格将状态字段设置一个值,来表明合格;固然若是不合格也须要设置一个值来表明不合格的状况。编辑器
这是一种最为原始的方式。经过状态字段虽然作到了流程控制,可是当咱们的流程发生变动的时候,这种方式所编写的代码也要进行调整。那么有没有专业的方式来实现工做流的管理呢?而且能够作到业务流程变化以后,咱们的程序能够不用改变,若是能够实现这样的效果,那么咱们的业务系统的适应能力就获得了极大提高。网站
为何Activiti就能够解决业务需求变动时,源代码不须要更新,更新的是业务流程图,原理是什么?spa
如何能够作到咱们在业务流程发生变动后,咱们的业务系统代码能够不发生改变?此时咱们就来分析一下原理。code
具体分析过程以下图所示:xml
Activiti 内部核心机制及实现原理图blog
原理:节点和表之间的信息转换,关键点就在这里。把节点的信息读取出来而后存入到表里边,未来在处理的时候,从表中读取记录,处理完以后将记录删掉,意味着这个环节就处理完了,而后再处理下一个节点。开发
Activiti 是一个工做流引擎, activiti 能够将业务系统中复杂的业务流程抽取出来,使用专门的建模语言(BPMN2.0)进行定义,业务系统按照预先定义的流程进行执行,实现了业务系统的业务流程由 activiti 进行管理,减小业务系统因为流程变动进行系统升级改造的工做量,从而提升系统的健壮性,同时也减小了系统开发维护成本。get
官方网站:https://www.activiti.org/工作流
Activiti7默认 25 张表,公司开发的软件是否适合使用activiti。
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>