工作流入门梳理

流程理解

在这里插入图片描述

网关

互斥网关 - 判断某条路径为True则执行

在这里插入图片描述

并行网关 - 全部为True则执行

在这里插入图片描述

相容网关 - 满足条件的全部执行,无论数量

在这里插入图片描述

配置文件

activiti.cfg.xml

Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接池参数

数据库

Activiti后台数据库

所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。

ACT_ RE_* : ‘ RE ’ 表示repository。 这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等)。

ACT_ RU_* : ‘ RU ’ 表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。

ACT_ ID_* : ‘ ID ’ 表示identity。 这些表包含身份信息,比如用户,组等等。

ACT_ HI_* : ‘ HI ’ 表示history。 这些表包含历史数据,比如历史流程实例,变量,任务等等。

ACT_ GE_* : 通用数据,用于不同场景下,如存放资源文件。

表分类表名解释详情
一般数据
[ACT_GE_BYTEARRAY]通用的流程定义和流程资源保存流程的bpmn的xml以及流程的lmage缩略图等信息
[ACT_GE_PROPERTY]系统相关属性Flowable相关的基本信息。例如各个modue使用的版本信息
流程历史记录
[ACT_HI_ACTINST]历史的流程实例
[ACT_HI_ATTACHMENT]历史的流程附件实例的历史附件,几乎不会使用,会加大数据库很大的一个
[ACT_HI_COMMENT]历史的说明性信息备注
[ACT_HI_DETAIL]历史的流程运行中的细节信息详情
[ACT_HI_IDENTITYLINK]历史的流程运行过程中用户关系实例节点中,如果指定了目标人,产生的历史
[ACT_HI_PROCINST]历史的流程实例
[ACT_HI_TASKINST]历史的任务实例
[ACT_HI_VARINST]历史的流程运行中的变量信息
流程定义表
[ACT_RE_DEPLOYMENT]部署单元信息部署对象,存储流程名称
[ACT_RE_MODEL]模型信息基于流程的模型信息
[ACT_RE_PROCDEF]已部署的流程定义
运行实例表
[ACT_RU_ACTINST]运行时实例表运行中实例的活动表
[ACT_RU_DEADLETTER_JOB]当JOB执行很多次都无法执行,就会被记录在此表
[ACT_RU_ENTITYLINK]还没使用到。后续更新此表
[ACT_RU_EVENT_SUBSCR]运行时事件
[ACT_RU_EXECUTION]运行时流程执行实例
[ACT_RU_HISTORY_JOB]运行中定时任务历史表
[ACT_RU_IDENTITYLINK]运行时用户关系信息,存储任务节点与参与者的相关信息
[ACT_RU_JOB]运行时作业运行中的异步任务
[ACT_RU_SUSPENDED_JOB]暂停的任务表如果一个异步任务在运行中被暂停,就会记录在词表
[ACT_RU_TASK]运行时任务运行中的正常节点任务
[ACT_RU_TIMER_JOB]定时作业表
[ACT_RU_VARIABLE]运行时变量表运行中的流程实例变量
组织信息
[ACT_ID_BYTEARRAY]
[ACT_ID_GROUP]用户组信息
[ACT_ID_INFO]用户详情
[ACT_ID_MEMBERSHIP]用户组和用户的关系
[ACT_ID_PRIV]权限
[ACT_ID_PRIV_MAPPING]用户组和权限之间的关系
[ACT_ID_PROPERTY]用户或者用户组属性拓展表
[ACT_ID_TOKEN]登录相关日志
[ACT_ID_USER]用户

Flowable后台数据库

FLW_*. 未找到官方描述

表分类表名解释详情
[FLW_CHANNEL_DEFINITION]泳池管道定义表保存流程的bpmn的xml以及流程的lmage缩略图等信息
[FLW_EVENT_DEFINITION]事件定义
[FLW_EVENT_DEPLOYMENT]事件必输
[FLW_EVENT_RESOURCE]事件所需资源
[FLW_EV_DATABASECHANGELOG]Liquibase执行的记录
[FLW_EV_DATABASECHANGELOGLOCK]Liquibase执行锁
[FLW_RU_BATCH]暂时未知
[FLW_RU_BATCH_PART]暂时未知

接口API

Activiti常用接口API

ProcessEngineConfiguration

创建spring与activiti的整合配置文件

ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")

ProcessEngine

Activity工作流引擎,Activiti工作的核心,负责生成流程运行时的各种实例及数据、监控和管理流程的运行。所有的操作都是从获取引擎开始的,所以一般会把引擎作为全局变量

//通过ProcessEngineConfiguration创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine = configuration.buildProcessEngine();

//创建完成后可随时获取
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

RepositoryService - 资源管理类

activiti的资源管理类,提供管理和控制流程发布包和流程定义的操作。使用业务流程图需要使用此service将流程定义文件的内容部署到计算机。

除了部署流程定义以外还可以:查询引擎中的发布包和流程定义。

暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。

获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。

RepositoryService repositoryService = processEngine.getRepositoryService();

RuntimeService - 流程运行管理类

RuntimeService runtimeService = processEngine.getRuntimeService();

TaskService - 任务管理类

TaskService taskService = processEngine.getTaskService();

HistoryService - 历史管理类

可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。

ManagerService - 引擎管理类

提供对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护。

代码示例

查询当前个人待执行的任务

@Test
public void testFindPersonalTaskList() {
    //获取引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //创建TaskService
    TaskService taskService = processEngine.getTaskService();
    //根据流程key 和 任务负责人 查询任务
    List<Task> list = taskService.createTaskQuery()
        .processDefinitionKey(DefinitionKey) //流程Key
        .taskAssignee(assigneeName)//只查询该任务负责人的任务
        .list();

    for (Task task : list) {
        System.out.println("流程实例id:" + task.getProcessInstanceId());
        System.out.println("任务id:" + task.getId());
        System.out.println("任务负责人:" + task.getAssignee());
        System.out.println("任务名称:" + task.getName());
    }
}

完成任务

// 完成任务
taskService.complete(task.getId());

查询流程定义

@Test
public void queryProcessDefinition(){
    //        获取引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //        repositoryService
    RepositoryService repositoryService = processEngine.getRepositoryService();
    //        得到ProcessDefinitionQuery 对象
    ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
    List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("myEvection")
        .orderByProcessDefinitionVersion()
        .desc()
        .list();
    //      输出流程定义信息
    for (ProcessDefinition processDefinition : definitionList) {
        System.out.println("流程定义 id="+processDefinition.getId());
        System.out.println("流程定义 name="+processDefinition.getName());
        System.out.println("流程定义 key="+processDefinition.getKey());
        System.out.println("流程定义 Version="+processDefinition.getVersion());
        System.out.println("流程部署ID ="+processDefinition.getDeploymentId());
    }
}

删除流程

使用repositoryService删除流程定义,历史表信息不会被删除

  • 如果该流程定义下没有正在运行的流程,则可以用普通删除。

  • 如果该流程定义下存在已经运行的流程,使用普通删除报错,可用级联删除方法将流程及相关记录全部删除。

先删除没有完成流程节点,最后就可以完全删除流程定义信息

public void deleteDeployment() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 通过流程引擎获取repositoryService
    RepositoryService repositoryService = processEngine
        .getRepositoryService();
    //删除流程定义,如果该流程定义已有流程实例启动则删除时出错
    repositoryService.deleteDeployment(deploymentId);
    //设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
    //repositoryService.deleteDeployment(deploymentId, true);
}

查看历史信息

@Test
public void findHistoryInfo(){
    //获取引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取HistoryService
    HistoryService historyService = processEngine.getHistoryService();
    //获取 actinst表的查询对象
    HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
    //查询 actinst表,条件:根据 InstanceId 查询
    //instanceQuery.processInstanceId("2501");
    //查询 actinst表,条件:根据 DefinitionId 查询
    instanceQuery.processDefinitionId(DefinitionId );
    //增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序
    instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
    //查询所有内容
    List<HistoricActivityInstance> activityInstanceList = instanceQuery.list();
    //输出
    for (HistoricActivityInstance hi : activityInstanceList) {
        System.out.println(hi.getActivityId());
        System.out.println(hi.getActivityName());
        System.out.println(hi.getProcessDefinitionId());
        System.out.println(hi.getProcessInstanceId());
    }
}

流程资源下载

通过流程定义对象获取流程定义资源,获取bpmn和png

public void  queryBpmnFile() throws IOException {
    //        1、得到引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //        2、获取repositoryService
    RepositoryService repositoryService = processEngine.getRepositoryService();
    //        3、得到查询器:ProcessDefinitionQuery,设置查询条件,得到想要的流程定义
    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
        .processDefinitionKey(processDefinitionKey)
        .singleResult();
    //        4、通过流程定义信息,得到部署ID
    String deploymentId = processDefinition.getDeploymentId();
    //        5、通过repositoryService的方法,实现读取图片信息和bpmn信息
    //        png图片的流
    InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
    //        bpmn文件的流
    InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
    //        6、构造OutputStream流
    File file_png = new File("filePath");
    File file_bpmn = new File("filePath");
    FileOutputStream bpmnOut = new FileOutputStream(file_bpmn);
    FileOutputStream pngOut = new FileOutputStream(file_png);
    //        7、输入流,输出流的转换
    IOUtils.copy(pngInput,pngOut);
    IOUtils.copy(bpmnInput,bpmnOut);
    //        8、关闭流
    pngOut.close();
    bpmnOut.close();
    pngInput.close();
    bpmnInput.close();
}

Flowable常用接口API

FormService

表单数据的管理

//获取表单key
formService.getStartFormKey()  
//查询表单json(无数据)
formService.getRenderedStartForm()  

RepositoryService

提供了在编辑和发布审批流程的api,主要是模型管理和流程定义的业务api

//1.提供了带条件的查询模型流程定义的api
repositoryService.createXXXQuery()
//例如:
repositoryService.createModelQuery().list() //模型查询 
repositoryService.createProcessDefinitionQuery().list() //流程定义查询

repositoryService.createXXXXQuery().XXXKey(XXX) //(查询该key是否存在)

//2.提供一大波模型与流程定义的通用方法
//模型相关
repositoryService.getModel()  //(获取模型)
repositoryService.saveModel()  //(保存模型)
repositoryService.deleteModel() //(删除模型)
repositoryService.createDeployment().deploy(); //(部署模型)
repositoryService.getModelEditorSource()  //(获得模型JSON数据的UTF8字符串)
repositoryService.getModelEditorSourceExtra()  //(获取PNG格式图像)

//3.流程定义相关
repositoryService.getProcessDefinition(ProcessDefinitionId);  //获取流程定义具体信息
repositoryService.activateProcessDefinitionById() //激活流程定义
repositoryService.suspendProcessDefinitionById()  //挂起流程定义
repositoryService.deleteDeployment()  //删除流程定义
repositoryService.getProcessDiagram()	//获取流程定义图片流
repositoryService.getResourceAsStream()	//获取流程定义xml流
repositoryService.getBpmnModel(pde.getId()) //获取bpmn对象(当前进行到的那个节点的流程图使用)

//4.流程定义授权相关
repositoryService.getIdentityLinksForProcessDefinition() //流程定义授权列表
repositoryService.addCandidateStarterGroup()//新增组流程授权
repositoryService.addCandidateStarterUser()	//新增用户流程授权
repositoryService.deleteCandidateStarterGroup() //删除组流程授权
repositoryService.deleteCandidateStarterUser()  //删除用户流程授权

RuntimeService

处理正在运行的流程

runtimeService.createProcessInstanceBuilder().start() //发起流程
runtimeService.deleteProcessInstance() //删除正在运行的流程
runtimeService.suspendProcessInstanceById() //挂起流程定义
runtimeService.activateProcessInstanceById() //激活流程实例
runtimeService.getVariables(processInstanceId); //获取表单中填写的值
runtimeService.getActiveActivityIds(processInstanceId)	//获取以进行的流程图节点 (当前进行到的那个节点的流程图使用)

runtimeService.createChangeActivityStateBuilder().moveExecutionsToSingleActivityId(executionIds, endId).changeState(); //终止流程

HistoryService

处理流程实例的API(用户发起审批后生成流程实例),包括已完成和未完成的实例

注意:处理正在运行的流程实例,使用runtimeService

historyService.createHistoricProcessInstanceQuery().list() //查询流程实例列表(历史流程,包括未完成的)
historyService.createHistoricProcessInstanceQuery().list().foreach().getValue() //可以获取历史中表单的信息
historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); //根绝id查询流程实例
historyService.deleteHistoricProcessInstance() //删除历史流程
historyService.deleteHistoricTaskInstance(taskid); //删除任务实例
historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).list()  //流程实例节点列表 (当前进行到的那个节点的流程图使用)

TaskService

对流程实例各个节点审批处理

//流转的节点审批
taskService.createTaskQuery().list() //待办任务列表
taskService.createTaskQuery().taskId(taskId).singleResult();  //待办任务详情
taskService.saveTask(task); //修改任务
taskService.setAssignee() //设置审批人
taskService.addComment() //设置审批备注
taskService.complete() //完成当前审批
taskService.getProcessInstanceComments(processInstanceId); //查看任务详情(也就是都经过哪些人的审批,意见是什么)
taskService.delegateTask(taskId, delegater); //委派任务
taskService.claim(taskId, userId);	//认领任务
taskService.unclaim(taskId); //取消认领
taskService.complete(taskId, completeVariables); //完成任务

//任务授权
taskService.addGroupIdentityLink()	//新增组任务授权
taskService.addUserIdentityLink() //新增人员任务授权
taskService.deleteGroupIdentityLink() //删除组任务授权
taskService.deleteUserIdentityLink() //删除人员任务授权

ManagementService

执行自定义命令

managementService.executeCommand(new classA())  //执行classA的内部方法 

//自定义方法中,获取repositoryService
ProcessEngineConfiguration processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
RepositoryService repositoryService = processEngineConfiguration.getRepositoryService();
//自定义方法中,获取流程定义方法集合
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
ProcessDefinitionEntityManager processDefinitionEntityManager = processEngineConfiguration.getProcessDefinitionEntityManager();
//例如findById/findLatestProcessDefinitionByKey/findLatestProcessDefinitionByKeyAndTenantId等。

IdentityService

用于身份信息获取和保存

identityService.createUserQuery().userId(userId).singleResult();  //获取审批用户的具体信息
identityService.createGroupQuery().groupId(groupId).singleResult(); //获取审批组的具体信息

流程图片为个人绘图,内容为多文章综合

Flowable相关引用来自 http://t.csdnimg.cn/p27Xy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值