一、工作流简介

1.什么是工作流?

简单的理解就是工作的流程,这里的流程指的是,完成一个企业中具体业务的一系列工作步骤,所有的步骤合在一起就是业务从开始到结束的流转过程。

从计算机系统的角度来讲,工作流系统表示:业务过程的部分和整体在计算机应用环境的自动化操作。

2.工作流的三大要素

①这个过程要做什么?

②经过多少个步骤?

③每个步骤是由谁来做,做什么,怎么做?

3.工作流系统的组成

流程定义工具:定义流程(画流程图)

表单定制工具:要提交的数据的表单的定制(可以用创建一个(html form)表单的表单形式替代)

工作流引擎: 工作流框架的核心,驱动着流程的流程,流程的数据共享,数据保存,流程的版本迭代....

管理监控工具:监控每一个流程的运转,管理每一个流程;

开发API:暴露给开发人员的api;

4.工作流需要解决的问题

1)、流程的自动化流程控制

2)、流程数据的保存(历史记录,历史数据的保存);

3)、流程版本的更替;(维护流程的版本更替);

4)、流程运行期间数据的共享等;

流程都具有一定的通用性;流程框架抽取流程的通用性,来统一管理和维护流程;

5.工作流的相关概念

①流程定义:(ProcessDefinition):

流程的定义:流程图。表示一个流程的信息;一个流程定义(如:请假流程图)

②流程实例:(ProcessInstance):

启动一个流程:称为创建一个流程的实例;无数个流程实例(如员工提交的请假单审批流程)

③流程变量:(ProcessVariable):

流程运行提交的数据,共享的数据,等;

④任务:(Task)

每一步需要完成的工作算是一个任务;(每一个流程运行都需要完成自己的流程规定的任务)

⑤开始、结束(Start 、End)

每一个流程只有一个入口,无数的出口;(正常结束的出口,异常结束的出口等)

⑥网关(Gateway):

流程的分支节点(判断节点);决定下一步走哪儿;

6.工作流产品

①JBPM

②OSWorkFlow

③Shark

④信雅达

⑤普元工作流

⑥Activiti5

7.ProcessEngine

ProcessEngine这个类是Activiti5的核心,所有的服务都需要通过ProcessEngine来创建,该类是线程安全的

Activiti5的持久化层采用的是Mybatis,这样移植性好,底层Spring+MyBatis;

Activiti5主要包括7个Service,这些Service都是通过ProcessEngine创建

repositoryService(持久化服务)

runtimeService(运行时服务)

formService(表单服务)

identityService(身份信息)

taskService(任务服务)

historyService(历史信息)

managementService(管理定时任务)

8.Activiti5框架表结构

Activiti使用到的表都是ACT_开头的。

ACT_RE_*: ‘RE’表示repository(存储),RepositoryService接口所操作的表。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。

ACT_RU_*: ‘RU’表示runtime,运行时表-RuntimeService。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。

ACT_ID_*: ’ID’表示identity (组织机构),IdentityService接口所操作的表。用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组,等等。

ACT_HI_*: ’HI’表示history,历史数据表,HistoryService。就是这些表包含着流程执行的历史相关数据,如结束的流程实例,变量,任务,等等

ACT_GE_*: 全局通用数据及设置(general),各种情况都使用的数据。

act_ge_bytearray二进制数据表

act_ge_property属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,

act_hi_actinst历史节点表

act_hi_attachment历史附件表

act_hi_comment历史意见表

act_hi_identitylink历史流程人员表

act_hi_detail历史详情表,提供历史变量的查询

act_hi_procinst历史流程实例表

act_hi_taskinst历史任务实例表

act_hi_varinst历史变量表

act_id_group用户组信息表

act_id_info用户扩展信息表

act_id_membership用户与用户组对应信息表

act_id_user用户信息表

act_re_deployment部署信息表

act_re_model流程设计模型部署表

act_re_procdef流程定义数据表

act_ru_event_subscr  throwEvent、catchEvent时间监听信息表

act_ru_execution运行时流程执行实例表

act_ru_identitylink运行时流程人员表,主要存储任务节点与参与者的相关信息

act_ru_job运行时定时任务数据表

act_ru_task运行时任务节点表

act_ru_variable运行时流程变量数据表

9.流程框架的标准

Business Process Management (BPM). 工作流管理系统

BPMN 2.0:Business Process Modeling Notation(中文:业务流程建模与标注)

OMG组织维护业务流程建模规范,以后所有流程框架绘制流程图都遵循这个规范;

二、流程框架的操作

1)、设计流程:画流程图;

2)、保存流程:给数据库中保存绘制的流程图(流程定义)

3)、导出流程:实际上绘制的流程是一个xml文件;bmpn规范;


<?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: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="电话费报销" name="话费报销" 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_电话费报销">

<bpmndi:BPMNPlane bpmnElement="电话费报销" id="BPMNPlane_电话费报销">

<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">

<omgdc:Bounds height="35.0" width="35.0" x="90.0" y="190.0"></omgdc:Bounds>

</bpmndi:BPMNShape>

<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">

<omgdc:Bounds height="55.0" width="105.0" x="170.0" y="180.0"></omgdc:Bounds>

</bpmndi:BPMNShape>

<bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">

<omgdc:Bounds height="55.0" width="105.0" x="320.0" y="180.0"></omgdc:Bounds>

</bpmndi:BPMNShape>

<bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">

<omgdc:Bounds height="55.0" width="105.0" x="470.0" y="180.0"></omgdc:Bounds>

</bpmndi:BPMNShape>

<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">

<omgdc:Bounds height="35.0" width="35.0" x="640.0" y="190.0"></omgdc:Bounds>

</bpmndi:BPMNShape>

<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">

<omgdi:waypoint x="125.0" y="207.0"></omgdi:waypoint>

<omgdi:waypoint x="170.0" y="207.0"></omgdi:waypoint>

</bpmndi:BPMNEdge>

<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">

<omgdi:waypoint x="275.0" y="207.0"></omgdi:waypoint>

<omgdi:waypoint x="320.0" y="207.0"></omgdi:waypoint>

</bpmndi:BPMNEdge>

<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">

<omgdi:waypoint x="425.0" y="207.0"></omgdi:waypoint>

<omgdi:waypoint x="470.0" y="207.0"></omgdi:waypoint>

</bpmndi:BPMNEdge>

<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">

<omgdi:waypoint x="575.0" y="207.0"></omgdi:waypoint>

<omgdi:waypoint x="640.0" y="207.0"></omgdi:waypoint>

</bpmndi:BPMNEdge>

</bpmndi:BPMNPlane>

</bpmndi:BPMNDiagram>

</definitions>


<process></process>规定整个流程的流转;

<userTask ></userTask>规定用户任务;

<sequenceFlow></sequenceFlow>指定流转方向等...

4)、流程部署:实际就是把流程的定义信息(详情)保存到数据库; 给数据保存了流程定义

5)、启动流程:按照流程定义启动一次流程(流程实例)

6)、流程实例:流程框架控制自动流转到下一步;

7)、签收任务完成任务;完成以后,流程框架自动判断来到下一步

8)、查看历史流程

三、Activiti5框架的几大组件

ProcessEngine :流程框架的核心 ;获取各大组件

activiti的七大组件:都是由流程引擎得到的;

以下为组件的获取方式:


ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

RuntimeService runtimeService = processEngine.getRuntimeService();

RepositoryService repositoryService = processEngine.getRepositoryService();

TaskService taskService = processEngine.getTaskService();

ManagementService managementService = processEngine.getManagementService();

IdentityService identityService = processEngine.getIdentityService();

HistoryService historyService = processEngine.getHistoryService();

FormService formService = processEngine.getFormService();


四、Activiti5的使用

1.导包(Activiti5默认使用的是h2的内存数据库,如果要使用mysql需要导入响应的驱动包)


<dependency>

<groupId>org.activiti</groupId>

<artifactId>activiti-engine</artifactId>

<version>5.22.0</version>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.42</version>

</dependency>


2.编写流程框架配置文件(文件名:activiti.cfg.xml)


<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- id必须是这个名称 -->

<bean id="processEngineConfiguration"

class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">

<!--数据库的连接相关信息 -->

<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti" />

<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />

<property name="jdbcUsername" value="root" />

<property name="jdbcPassword" value="123456" />

<!-- 第一次启动创键数据库;以后升级数据库表结构 -->

<property name="databaseSchemaUpdate" value="true" />

<property name="jobExecutorActivate" value="false" />

<property name="asyncExecutorEnabled" value="true" />

<property name="asyncExecutorActivate" value="false" />

<!--设置解决乱码问题  -->

<property name="activityFontName" value="微软雅黑"></property>

<property name="annotationFontName" value="微软雅黑"></property>

<property name="labelFontName" value="微软雅黑"></property>

</bean>

</beans>


3.获取流程引擎


public static void main(String[] args) {

//第一次获取流程引擎会创建很多表

ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

System.out.println(engine.toString());

}


第一次创建数据表时,此表中会有三条记录:

 


五、在eclipse中使用activiti5绘制流程图

1.安装绘制流程图的插件

2.部署流程(把流程定义(流程图)保存到数据库中);每次部署产生一个【流程定义】


/**

* 部署项目

*/

@Test

public void testDeployement() {

ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

RepositoryService repositoryService = engine.getRepositoryService();

Deployment deployment = repositoryService.createDeployment().addClasspathResource("话费报销流程.bpmn").deploy();

System.out.println(deployment.getName());

System.out.println(deployment.getId());

System.out.println(deployment.getDeploymentTime());

}


数据库效果:

act_ge_bytearray

act_re_deployment

act_re_procdef

id_:流程定义的唯一id;流程引擎自动生成的;

rev_:数据库乐观锁机制

category_:分类

name_:流程定义的名字

key_:流程定义的key

version_:流程的版本号

deployment_id:那次部署产生的这个流程定义

resource_name_:流程定义的xml文件的名字;

dgrm_resource_name_:流程图的文件的名字;

其他等等的信息...

每一个流程图都有三个数据;

同一个流程部署多次会产生多个版本;根据每一个流程图的id来区分;


3.查询流程部署信息


/**

* 查看数据库的流程部署信息

*/

@Test

public void testQueryPdeployment() {

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

RepositoryService repositoryService = processEngine.getRepositoryService();

DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();

List<Deployment> list = deploymentQuery.list();

for (Deployment deployment : list) {

System.out.println("部署流程id"+deployment.getId());

System.out.println("部署流程名字"+deployment.getName());

System.out.println("部署流程时间"+deployment.getDeploymentTime());

}

}


4.查询流程定义信息


/**

* 查看数据库的流程定义信息

*/

@Test

public void testQueryPdefintion(){

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

RepositoryService repositoryService = processEngine.getRepositoryService();

//获取数据库中所有的流程定义信息

List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();

for (ProcessDefinition processDefinition : list) {

System.out.println("部署的定义目录"+processDefinition.getCategory());

System.out.println("部署的定义id"+processDefinition.getDeploymentId());

System.out.println("部署的定义key"+processDefinition.getKey());

System.out.println("部署的定义name"+processDefinition.getName());

System.out.println("部署的定义版本"+processDefinition.getVersion());

System.out.println("部署的定义流程图资源名"+processDefinition.getDiagramResourceName());

}

}


3.启动流程


/**

* 启动一个流程

*/

@Test

public void testStart() {

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

RepositoryService repositoryService = processEngine.getRepositoryService();

ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();

ProcessDefinition processDefinition = processDefinitionQuery.processDefinitionVersion(2).singleResult();

RuntimeService runtimeService = processEngine.getRuntimeService();

ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());

System.out.println("流程启动完成"+processInstance);

}


4.查询任务,签收任务


如果某个任务已经固定分配给某个人了,就不能再签了;如果要签,先要撤销签收unclaim;

/**

* 查找当前流程运行的任务;

*/

@Test

public void testQueryTask() {

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

TaskService taskService = processEngine.getTaskService();

//查询当前任务

Task task = taskService.createTaskQuery().singleResult();

System.out.println(task);

//签收任务

taskService.claim(task.getId(), "admin");

System.out.println("admin签收了"+task);

}


5.执行任务,并自动流转到下一个流程


/**

* 执行任务

*/

@Test

public void testQueryTaskByUser() {

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

TaskService taskService = processEngine.getTaskService();

//获取admin要执行的任务

Task task = taskService.createTaskQuery().taskAssignee("admin").singleResult();

//执行任务

taskService.complete(task.getId());

System.out.println("admin完成任务"+task);

}


6.查询任务的执行历史


/**

* 查询任务的执行历史

*/

@Test

public void testHistory() {

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

//获取HistoryService进行历史任务的检索等操作

HistoryService historyService = processEngine.getHistoryService();

//查询所有已经完成的流程实例

List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().processFinished().list();

for (HistoricTaskInstance historicTaskInstance : list) {

//查询那个历史任务是由谁在什么时间开始,在什么时间结束

System.out.println(historicTaskInstance);

System.out.println(historicTaskInstance.getName()+"===>"+historicTaskInstance.getAssignee()+"===>"+historicTaskInstance.getStartTime()+"===>"+historicTaskInstance.getEndTime());

}

}


springBoot集成Activiti5.0相关推荐

  1. springboot集成activity6.0.0

    个人博客地址:www.wzbjsz.cn 在线浏览地址:activiti.wzbjsz.cn 什么是工作流? 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是&quo ...

  2. SpringBoot集成OAuth2.0有新方案了

    背景说明 SpringBoot 2.X已经抛弃了对Spring Security OAuth模块,而是通过Spring Security 5 支持了OAuth 2.0.客户端.资源服务器.授权服务器. ...

  3. SpringBoot集成Mybatis(0配置注解版)

    Mybatis初期使用比较麻烦,需要各种配置文件.实体类.dao层映射关联.还有一大推其它配置.当然Mybatis也发现了这种弊端,初期开发了generator可以根据表结构自动生成实体类.配置文件和 ...

  4. SpringCloudSpringBoot集成Acivity6.0

    SpringCloud&SpringBoot集成Acivity6.0 一:在MAVEN项目中配置pom.xml SpringCloud需要的几个基础包 以下是要对集成的Activity几个必要 ...

  5. SpringBoot集成knife4j实现Swagger接口文档

    前言:如果你是后台开发,提供restful接口给前端,建议你使用Swagger3提供restful的接口文档自动生成和在线接口调试.knife4j是对Swagger进一步封装,其优化了API文档的UI ...

  6. 【Java从0到架构师】交错的日志系统、SpringBoot 集成日志框架

    交错的日志系统.SpringBoot 集成日志框架 交错复杂的日志系统① - 多个项目实现 SLF4J 门面 交错复杂的日志系统② - 统一底层实现为 Logback 交错复杂的日志系统③ - 统一底 ...

  7. springboot集成支付宝支付2.0

    springboot集成微信APP支付V3最新版 流程详解 创建应用 添加支付能力 接口加签 获取证书 集成支付到springboot项目 流程详解 相对于集成微信支付来说,支付宝相对简单些,支付宝对 ...

  8. SpringBoot集成activiti工作流

    SpringBoot集成activiti工作流(模拟请假流程) 链接:https://pan.baidu.com/s/10BT_Zertm1WBBrlrdE-QWQ  提取码:zsq6 学习视频地址见 ...

  9. Activiti 快速入门教程:SpringBoot 集成 Activiti6 + Activiti Modeler 流程配置可视化

    Activiti 快速入门教程:SpringBoot 集成 Activiti6 + Activiti Modeler 流程配置可视化 7大服务与核心表 23张表概览 7大核心服务(重要) 加依赖 内部 ...

最新文章

  1. Redis与DB数据同步问题
  2. SpringBoot(四)-- 整合Servlet、Filter、Listener
  3. 小鱼儿 c语言,小鱼儿请进.
  4. Xmemcached学习笔记一(安装memcached)
  5. cri-o 与 cni的集成分析
  6. 设计模式的C语言应用-责任链模式-第三章
  7. SQL Server2014安装流程及注意事项
  8. PCL之估计整个点云表面法向量
  9. wow mysql dbc_WoW的DBC文件内容描述-魔兽有爱论坛 - 一个魔兽世界爱好者的聚集地 uiwow.com - Powered by Discuz!...
  10. Java学习笔记——网络编程
  11. 统计学习基础(第二版)——引言
  12. eclipse windowJAVA版64位安装教程
  13. PCIE配置空间设置
  14. 算法学习(2)----丢番图方程
  15. FBX与Opengl骨骼系统
  16. python爬取京东评论怎么翻页_爬取京东网页评论(动态网页)
  17. 等额本金和等额本息房贷公式推导
  18. vue数组去重 数组对象去重
  19. 传统中小企业对SEO的错误认识和偏见
  20. 达特茅斯计算机专业师资力量如何,达特茅斯学院(Dartmouth College)计算机科学Computer Science专业排名第126-150位(2021年THE世界大学商科排名)...

热门文章

  1. 有哪些免费的开源商城系统推荐?
  2. 专科生学计算机毕业升本,专科生请注意:“升本”的机会来了
  3. 个税年度汇算开始!有人退了2w元,一文看懂如何操作
  4. 实战解决使用ghost安装系统出现的各种问题
  5. 基础会计学习笔记12
  6. 618买什么最划算?跟着购物指南买绝对不会错
  7. S参数与插入损耗和回波损耗
  8. 使用git命令提示“不是内部或外部命令
  9. 无人机驾驶员培训学习记录(二十)
  10. 复盘_8月(第4周工作复盘)