Activity工作流引擎

Activiti是一个工作流引擎

关键表

ACT_RE:流程定义和流程静态资源 (图片,规则)

ACT_RE_DEPLOYMENT:部署单元信息deployment
ACT_RE_MODEL:模型信息
ACT_RE_PROCDEF:已部署的流程定义

ACT_RU:运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据

ACT_RU_EVENT_SUBSCR:运行时事件
ACT_RU_EXECUTION:运行时流程执行实例
ACT_RU_IDENTITYLINK:运行时用户关系信息,存储任务节点与参与者的相关信息
ACT_RU_JOB:运行时作业
ACT_RU_TASK:运行时任务
ACT_RU_VARIABLE:运行时变量表

ACT_HI:包含历史数据,比如历史流程实例,变量,任务

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_GE: 通用数据, 用于不同场景下

ACT_GE_BYTEARRAY:通用的流程定义和流程资源
ACT_GE_PROPERTY:系统相关属性

引擎创建

//先构建ProcessEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//通过ProcessEngineConfiguration创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine = configuration.buildProcessEngine();

获取service

RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();

Service总览

RepositoryService:资源管理类
提供了管理和控制流程发布和流程定义的操作
RuntimeService:流程运行管理类
获取很多关于流程执行相关的信息
TaskService:任务管理类
获取任务的信息。
HistoryService:历史管理类
查询历史信息,流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径
ManagerService:引擎管理类
管理和维护功能

定义流程

.bpmn文件
事件Event
活动Activity
网关GateWay
流向Flow

流程部署

RepositoryService
	//使用RepositoryService进行部署
    Deployment deployment = repositoryService.createDeployment()
        .addClasspathResource("bpmn/evection.bpmn") // 添加bpmn资源
        .addClasspathResource("bpmn/evection.png")  // 添加png资源
        .name("出差申请流程")
        .deploy();
	流程定义部署后操作activiti的3张表如下:
	act_re_deployment:流程定义部署表,每部署一次增加一条记录
	act_re_procdef:流程定义表,部署每个新的流程定义都会在这张表中增加一条记录
	act_ge_bytearray:流程资源表 

启动流程

//2、获取RunTimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
	//3、根据流程定义Id(定义流程的时候指定)启动流程
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceByKey("myEvection");
				
	操作数据表
	act_hi_actinst     流程实例执行历史
	act_hi_identitylink  流程的参与用户历史信息
	act_hi_procinst      流程实例历史信息
	act_hi_taskinst       流程任务历史信息
	act_ru_execution   流程执行信息
	act_ru_identitylink  流程的参与用户信息
	act_ru_task              任务信息

查询任务

任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。
	//创建TaskService
    TaskService taskService = processEngine.getTaskService();
	//根据流程key 和 任务负责人 查询任务
    List<Task> list = taskService.createTaskQuery()
        .processDefinitionKey("myEvection") //流程Key
        taskAssignee("用户名")//只查询该任务负责人的任务
        .list();

处理流程任务:
	//根据流程key 和 任务的负责人 查询任务
	//返回一个任务对象
    Task task = taskService.createTaskQuery()
        .processDefinitionKey("myEvection") //流程Key
        .taskAssignee("zhangsan")  //要查询的负责人
        .singleResult();
	//完成任务,参数:任务id
    taskService.complete(task.getId());

流程定义信息查询

//得到ProcessDefinitionQuery 对象
    ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
	//查询出当前所有的流程定义
	//条件:processDefinitionKey =evection
	//orderByProcessDefinitionVersion 按照版本排序
	//desc倒叙
	//list 返回集合
    List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("myEvection")
        .orderByProcessDefinitionVersion()
        .desc()
        .list();

删除流程

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

下载流程资源

//1、得到引擎
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	//2、获取repositoryService
	RepositoryService repositoryService = processEngine.getRepositoryService();
	//3、得到查询器:ProcessDefinitionQuery,设置查询条件,得到想要的流程定义
	ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
		.processDefinitionKey("myEvection")
		.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流

流程实例:代表流程定义的执行实例

业务表和Activiti引擎表关联(BusinessKey)
启动流程实例,添加businessKey:
//1、得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、得到RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//3、启动流程实例,同时还要指定业务标识businessKey,也就是出差申请单id,这里是1001
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myEvection","1001");

act_ru_execution中存储业务标识

挂起、激活流程实例

全部流程实例挂起:(流程定义id-》repositoryService)
	//获取processEngine
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	//获取repositoryService
	RepositoryService repositoryService = processEngine.getRepositoryService();
	//查询流程定义的对象
	ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().
	processDefinitionKey("myEvection").
	singleResult();
	//得到当前流程定义的实例是否都为暂停状态
	boolean suspended = processDefinition.isSuspended();
	//流程定义id
	String processDefinitionId = processDefinition.getId();
	//判断是否为暂停
	if(suspended){
	//如果是暂停,可以执行激活操作 ,参数1 :流程定义id ,参数2:是否激活,参数3:激活时间
	repositoryService.activateProcessDefinitionById(processDefinitionId,true,null);
	System.out.println("流程定义:"+processDefinitionId+",已激活");
	}else{
	//如果是激活状态,可以暂停,参数1 :流程定义id ,参数2:是否暂停,参数3:暂停时间
	repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null);
	System.out.println("流程定义:"+processDefinitionId+",已挂起");
	}

单个流程实例挂起:(流程实例对象id-》RuntimeService)

//获取processEngine
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	//RuntimeService
	RuntimeService runtimeService = processEngine.getRuntimeService();
	//查询流程定义的对象
	ProcessInstance processInstance = runtimeService.
		createProcessInstanceQuery().
		processInstanceId("15001").
		singleResult();
	//得到当前流程定义的实例是否都为暂停状态
	boolean suspended = processInstance.isSuspended();
	//流程实例id
	String processDefinitionId = processInstance.getId();
	//判断是否为暂停
	if(suspended){
	//如果是暂停,可以执行激活操作 ,参数:流程定义id
		runtimeService.activateProcessInstanceById(processDefinitionId);
	System.out.println("流程实例id:"+processDefinitionId+",已激活");
	}else{
	//如果是激活状态,可以暂停,参数:流程定义id
	runtimeService.suspendProcessInstanceById( processDefinitionId);
	System.out.println("流程实例id:"+processDefinitionId+",已挂起");
	}
	

分配任务负责人

UEL表达式 ${变量名}
	//获取流程引擎
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	//获取 RuntimeService
	RuntimeService runtimeService = processEngine.getRuntimeService();
	//设置assignee的取值,用户可以在界面上设置流程的执行
	Map<String,Object> assigneeMap = new HashMap<>();
	assigneeMap.put("assignee0","张三");
	assigneeMap.put("assignee1","李经理");
	assigneeMap.put("assignee2","王总经理");
	assigneeMap.put("assignee3","赵财务");
	//启动流程实例,同时还要设置流程定义的assignee的值
	runtimeService.startProcessInstanceByKey("myEvection1",assigneeMap);
	
	监听器分配:
	1.流程设计的时候指定监听器,设置Event,type,class
	2.定义对应的监听器,设置处理逻辑。

流程变量:分支的判断变量

作用域: globa变量:流程变量的默认作用域是流程实例 taskService.setVariable(taskId, “evection”, evection); local变量:针对一个任务和一个执行实例范围 taskService.setVariablesLocal(taskId, variables);

组任务:任务设置多个候选人,可以从候选人中选择参与者来完成任务。一个人完成即可。

在流程图中任务节点的配置中设置 candidate-users(候选人),多个候选人之间用逗号分开。
a、查询组任务
//查询组任务
List list = taskService.createTaskQuery()
.processDefinitionKey(processDefinitionKey)
.taskCandidateUser(candidateUser)//根据候选人查询
.list();
b、拾取(claim)任务
//拾取任务
taskService.claim(taskId, userId);
c、查询个人任务
List list = taskService.createTaskQuery()
.processDefinitionKey(processDefinitionKey)
.taskAssignee(assignee)
.list();
d、办理个人任务
processEngine.getTaskService()
.complete(taskId);
e、归还组任务
// 如果设置为null,归还组任务,该 任务没有负责人
taskService.setAssignee(taskId, null);

排他网关ExclusiveGateway:

只有一条路径会被选择。流程执行到该网关时,按照输出流的顺序逐个计算,当条件的计算结果为true时,继续执行当前网关的输出流;
​ 如果多条线路计算结果都是 true,则会执行第一个值为 true 的线路。如果所有网关计算结果没有true,则引擎会抛出异常。
​ 排他网关需要和条件顺序流结合使用,default 属性指定默认顺序流,当所有的条件不满足时会执行默认顺序流。

并行网关ParallelGateway

所有路径会被同时选择
​ 拆分 —— 并行执行所有输出顺序流,为每一条顺序流创建一个并行执行线路。
​ 合并 —— 所有从并行网关拆分并执行完成的线路均在此等候,直到所有的线路都执行完成才继续向下执行。

包含网关InclusiveGateway

可以同时执行多条线路,也可以在网关上设置条件
​ 拆分 —— 计算每条线路上的表达式,当表达式计算结果为true时,创建一个并行线路并继续执行
​ 合并 —— 所有从并行网关拆分并执行完成的线路均在此等候,直到所有的线路都执行完成才继续向下执行。

事件网关EventGateway

专门为中间捕获事件设置的,允许设置多个输出流指向多个不同的中间捕获事件。当流程执行到事件网关后,流程处于等待状态,需要等待抛出事件才能将等待状态转换为活动状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值