学习流程,
首先了解工作流的基础知识及相关概念。
一、本项目常用
1、查询对象。Activiti的各个服务组件(XXXService)均提供了createXXXQuery方法,这些方法返回一个Query实例,例如createGroupQuery返回GroupQuery,GroupQuery是Query的子接口。
Query是所有查询对象的父接口,该接口中定义了若干个基础方法,各个查询对象均可以使用这些公共方法,包括设置排序方式、数据量统计(count)、列表、分页、和唯一记录查询。这些方法描述如下:
asc:设置查询结果的排序方式为升序。
count:计算查询结果的数据量。
desc:设置查询结果的排序方式为降序。
list:封装查询结果,返回相应类型的集合。
listPage:分页返回查询结果,返回相应类型的集合。
singleResult:查询单条符合条件的数据,如果查询不到,则返回null;如果查询到多条记录,则抛出异常。
2、TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务等。
3、ProcessInstance流程实例:ProcessInstance是一个接口,一个ProcessInstance实例表示一个流程实例,ProcessInstance实际上是执行流(Execution)的子接口,流程实例也就是一个执行流。ProcessInstance中有Execution没有的属性,例如流程定义和业务主键。当得到一个ProcessInstance实例时,就将其看作一个流程实例;当得到一个Execution实例时,它就是一个执行流。流程实例与执行流的数据保存在执行表(ACT_RU_EXECUTION)中,对应的映射实体为ExecutionEntityImpl。ExecutionEntityImpl主要包括以下映射属性。
id:主键ID,对应 ACT_RU_EXECUTION 表的ID 。
revision:该数据的修订版本号, 对应阻REV_字段。
businessKey:流程实例的业务主键,只有 Processlnstance 实例才有该值。
parentld:父执行流的ID,在没有流程分支的情况下,流程实例与执行流的父ID 为同一条数据,如果出现新的执行流,那么将会 设置该值,对应 PARENT_ID字段。
processDefinitionld:流程定义 ID,不管是流程实例数据还是执行流数据,该字段均会被设置为相应的流程定义ID,对应
PROC_ DEF_ID字段。
superExecutionld:父执行流的ID,如果该执行流是子流程的一部分,则该值不为 null, 对应 SUPER_EXEC_字段。
activityld:当前执行流的动作, 一般为流程节点的名称,对应 ACT_ID_字段。
isActive:该执行流状态是否活跃,如果当前的执行流分为两个子执行流,则当前的执行流被标识为非活跃状态,而两个子执行流则为活跃状态,对应 IS_ACTIVITE_字段。
isConcurrent:执行流是否并行, 对应 IS_CONCURRENT字段。
isScope:是否在执行流范围内 。
isEventScope: 是否在事件范围内 。
suspensionState:流程中断状态, l 为活跃, 2 为中断。
以上对 ExecutionEntitylmpl 的部分属性进行了简单描述,各个属性更详细的含义及作用, 将会在后面章节中详细讲解。
4、Task接口:一个 Task 实例表示流程中的一个任务,与其他实例一样, Task 是一个接口,并且遵守数据映射实体的命名规范。 Task 的实现类为 TaskEntitylmpl,对应的数据库表为 ACT_RU_TASK. TaskEntitylmpl 包括以下映射属性。
id: 主键,对应ID字段。
revision: 该数据版本号,对应阻REV_字段。
owner:任务拥有人,对应OWNER_字段。
assignee:被指定需要执行任务的人,对应 ASSIGNEE_字段。
delegationState:任务被委派的状态,对应 DELEGATION_字段。
parentTaskld:父任务的 ID (如果本身是子任务的话),对应 PARENT_TASK_ ID_字段。
name:任务名称,对应 NAME 字段。
description:任务的描述信息,对应 DESCRIPTION_字段。
priority:任务的优先级,默认值为 50,表示正常状态,对应PRIORITY_字段。
createTime: 任务创建时间,对应 CREATE_TIME_字段。
dueDate:预订日期,对应 DUE_DATE_字段。
executionld:该任务对应的执行流 D,对应 EXECUTION_ID_字段。
processDefinitionld:任务对应的流程定义ID,对应 PROC_DEF_ID_字段。
claimTime:任务的提醒时间,对应 CLAIM_TIME_字段。
5、.excludeTaskVariables()方法。
即判断taskId和taskIds是否为空,若为空则返回Cannot use taskId(s) together with excludeTaskVariables错误。
二、根据书籍,进行activiti的下载安装和小案例的练习,学习书籍:疯狂工作流讲义 基于Activiti 6.x的应用开发。
activit版本下载:https://github.com/Activiti/Activiti/releases/tag/activiti-6.0.0
1、BPMN元素
2为用户分配任务
三、安装。
安装与运行Activiti:https://blog.csdn.net/boxiong86/article/details/78423800
插件安装:
activiti idea插件安装:https://www.cnblogs.com/No2-explorer/p/11032469.html
activit使用:https://www.cnblogs.com/jpfss/p/11078285.html
activit使用的案例:https://www.cnblogs.com/runtimeexception/p/8961395.html
四、好的资源
https://www.cnblogs.com/javalaw/p/7881507.html
书籍写在博客上资源:https://blog.csdn.net/boxiong86/category_7259762.html
五、工作流的几个错误
1、 activiti创建数据库表报错
org.activiti.engine.ActivitiException: no activiti tables in db. set <property name="databaseSchemaUpdate" to value="true" or value="create-drop" (use create-drop for testing only!) in bean processEngineConfiguration in activiti.cfg.xml for automatic schema creation
解决方法:
表创建是要先主在从加上如下一句代码conf.setDatabaseSchemaUpdate("true");该属性可以设置流程引擎 启动和关闭时数据库执行的策略。通常有三个值:(1)false,默认值,设置为该值后,activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配,将在启动时抛出异常。(2)true:设置该值后,Acitiviti会对数据库中所有的表进行更新,如果表不存在,则Activiti会自动创建。(3)create-drop:acitiviti启动时,会执行数据库表的创建操作,activiti关闭时,执行数据库表的删除操作。
2、 未找到ID为的已部署流程定义错误。
org.activiti.engine.ActivitiObjectNotFoundException: no deployed process definition found with id 's。
解决方法:仔细看上面的异常是指定的流程定义ID不存在。再仔细看看我的代码,我的愿意是通过流程定义中<process>元素的id去启动流程。但是我错误写使用了startProcessInstanceById方法。
方法一、因此将startProcessInstanceById()方法改为startProcessInstanceByKey()方法就解决问题了。你到act_re_procdef表中去查看ID_字段的格式为:myProcess:1:4,所以根本就不存在ID等于myProcess的流程定义。
方法二、去mysql表中找到表,去看ID,然后将方法里ID名字改为数据库里的名字。