技术标签: activiti
一、流程部署
1.部署流程
下面代码是通过ZipInputStream方式进行部署,也是最常用的一种方式。
流程部署后,会生成“部署对象”和“流程定义”。
@Autowired
Repositoryservice repositoryService;
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
Deployment deployment = repositoryService.createDeployment() // 创建部署
.name(fileName) // 设置部署名称
.addZipInputStream(zipInputStream) // 根据zip输入流部署
.deploy(); // 开始部署
流程部署后,会操作如下表
act_re_deployment:插入部署对象,仅记录部署名及部署时间
act_ge_bytearray:插入BPMN的两个文件(.bpmn和.png),包括部署ID
act_re_procdef:插入流程定义信息,包括部署ID,流程的Key和Name,版本,两个资源文件
select * from act_re_procdef; --流程定义
select * from act_re_deployment; -- 流程部署
select * from act_ge_bytearray; -- 存储二进制文件
2.查询流程定义列表
对流程定义查询前提是要创建流程定义查询,即:createProcessDefinitionQuery()
@Autowired
Repositoryservice repositoryService;
String key = "%process%";
List<ProcessDefinition> list = repositoryService
.createProcessDefinitionQuery() // 创建流程定义查询
.latestVersion() // 只查询最新版本
.processDefinitionKeyLike(key) // 根据Key进行模糊查询
.list(); // 返回列表
3.根据部署ID查询部署
对部署进行查询时,要提前创建部署查询,即:createDeploymentQuery()
@Autowired
Repositoryservice repositoryService;
String deploymentId = "5522";
repositoryService.createDeploymentQuery() // 创建部署查询
.deploymentId(deploymentId) // 根据部署ID查询
.singleResult(); // 返回唯一结果
4.删除部署
@Autowired
Repositoryservice repositoryService;
String deploymentId = "5522";
repositoryService.deleteDeployment(deploymentId); // 根据部署ID删除流程部署
删除部署会操作如下表,若级联删除,会将运行中的实例与历史实例一同删除
act_re_deployment:删除部署对象
act_ge_bytearray:删除资源文件
act_re_procdef:删除流程定义信息
二、启动流程
1.根据流程定义的Key启动
流程启动后,会创建“流程实例”和“任务”,而我们需要将我们的业务与流程实例进行绑定,这样才能确定我们的业务是使用的哪个流程实例。
流程定义可以理解为一个流程的模板,只能有一个;而流程实例是根据流程定义生成的一个具体的实例,可以有多个,一个审批业务对应一个流程实例。
@Autowired
RuntimeService runtimeService;
String processDefinitionId = "333";
runtimeService.startProcessInstanceByKey(processDefinitionId);
流程启动后,会操作如下表
act_ru_execution:执行流程实例表,核心,启动后会生成一个流程实例和待执行的任务节点
act_ru_task:用户任务表,待执行的任务
act_ru_identitylink:用户身份关系表,存储待执行任务的用户关系
act_hi_taskinst:历史用户任务表,存储所有已执行或待执行的用户任务历史
act_hi_procinst:历史流程实例表,存储流程实例
act_hi_actinst:历史活动节点表,存储所有已执行的节点(各类节点)
act_hi_identitylink:历史用户身份关系表,历史用户任务的关系表
select * from act_ru_execution; --执行流程实例表
select * from act_ru_task; -- 用户任务表
select * from act_ru_identitylink; -- 用户身份关系表
select * from act_hi_taskinst; -- 历史用户任务表
select * from act_hi_procinst; -- 历史流程实例表
select * from act_hi_actinst; -- 历史活动节点表
select * from act_hi_identitylink; -- 历史用户身份关系表
三、执行任务
1.查看我的任务列表
@Autowired
TaskService taskService;
String assignee = "可以是办理人的ID";
int startPage = 1;
int pageSize = 10;
List<Task> list = taskService.createTaskQuery() // 创建任务查询
.taskAssignee(assignee) // 按照当前输人查询
.orderByTaskCreateTime().desc() // 按任务创建时间排序,倒序排序
.listPage(startPage, pageSize); // 分页查询出任务列表
2.执行任务
执行任务后,会自动根据条件跳转到下一任务
@Autowired
TaskService taskService;
String taskId = "20005";
taskService.complete(taskId); // 根据任务ID执行任务
执行任务后,表数据发生的变化
act_ru_execution:待执行的用户任务节点换成下一个用户任务节点
act_ru_task:当前待执行任务转历史,插入下一个任务
act_ru_identitylink:插入下一任务的用户关系
act_hi_taskinst:修改当前用户任务的完成时间,并插入一用户任务
act_hi_actinst:修改当前活动节点的完成时间,并插入下一个活动节点
act_hi_identitylink:插入下一任务的用户关系
3.任务结束
执行完最后一个节点后,流程会自动结束。
流程结束后,表格数据变化。
act_ru_execution:删除当前流程实例的运行时执行数据
act_ru_task:删除当前流程实例的运行时任务数据
act_ru_identitylink:删除当前流程实例的运行时用户关系数据
可通过如下方式判断流程实例是否结束
@Autowired
RuntimeService runtimeService
String processInstanceId = "2200";
ProcessInstance singleResult = runtimeService.createProcessInstanceQuery() // 创建流程实例查询
.processInstanceId(processInstanceId) // 根据流程实例ID查询
.singleResult(); // 返回唯一结果
if(singleResult == null){
System.out.println("流程结束");
}
欢迎关注《Java面试题2.0》合集发布页,持续更新中!概念:Solr是目前非常受欢迎的基于Apache开源组织下Lucene开发的一个开源高性能的企业级搜索平台。Solr具有高度可靠性、可扩展性、可容错性的特点,提供了分布式索引、索引备份、查询负载均衡、自动故障转移和恢复,以及集中配置等功能。core想要在Solr中添加索引,你需要指定一个Core,即你需要把索引数据添加Solr中的Core术语指的是一个单一的索引数据,而索引又是由多个Docum...
用3个zookeeper搭建一个zookeeper集群,首先配置好一个zookeeper1,其余两个都是按照zookeeper1复制过来,然后稍微修改运行集群成功,查看zookeeper状态可以看出,zookeeper2是从节点,zookeeper3是主节点,但是zookeeper1是单机模式状态因为都是由1复制过去的,联想到在修改zoo.cfg时,其他节点都修改了端口...
通过java API访问Elasticsearch中的数据
原文URL:http://news.xinhuanet.com/legal/2009-07/01/content_11634317.htm ×××保守国家秘密法(修订草案) 第一章 总 则 第一条 为了保守国家秘密,维护国家的安全和利益,保障改革开放和社会主义建设事业的顺利进行,制定本法。 ...
原始数据为 csv 文件。data'''date,temperature,humidity07/01/21,95,5007/02/21,94,5507/03/21,94,56'''一、读取时指定索引列默认索引从0开始,可通过 index_col设置索引列。import osos.chdir(r'C:\Users\111\Desktop')import pandas as pdimport numpy as np# 指定时间索引data = pd.read_csv('dat
并查集板子const int N=10010;int n,m;int fa[N];int find(int k){ if(fa[k]==k) return k; else return fa[k]=find(fa[k]);}int main(){ cin>>n>>m; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++){ int x,y,z; cin>>z>>x
ZeroMQ轻量级消息传递内核是一个库,该库扩展了标准套接字接口,具有传统上由专用消息传递中间件产品提供的功能。ZeroMQ套接字提供了异步消息队列,多种消息传递模式,消息过滤(订阅),对多种传输协议的无缝访问等等的抽象。...
给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:2。题目保证输入与输出均在整型范围内。输入格式:输入在一行中给出一个华氏温度。输出格式:在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。输入样例:150输出样例:Celsius = 65#include &lt;stdio.h&gt;int main (){ int F,C; scanf("%...
【有符号数的编码规则】 原码 最高位为符号位,其余各位为数值本身的绝对值。 反码 正数:反码与原码相同。 负数:符号位为1,其余位对原码取反。 补码 正数:补码与原码相同。 负数:符号位为1,其余位对原码取反+1(反码+1)。 例:数值:-1原码:1000 0001反码:1111 1110补码:1111 1111数值:-7原码:1000 0111反码:1111 1000补码:1111 1001【十六进制与二进制】
js监听页面滚动距离window.onscroll = function() { //为了保证兼容性,这里取两个值,哪个有值取哪一个 //scrollTop就是触发滚轮事件时滚轮的高度 var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; console.log("滚动距离" + scrollTop);}vue.js监听页面滚动距离 mounted() { windo
一、奇异值与特征值基础知识: 特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法。两者有着很紧密的关系,我在接下来会谈到,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。先谈谈特征值分解吧: 1)特征值: 如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式: 这时候λ就被称为特征向量v对应的特征
网站的图标一般都放在根目录,文件名为favicon.ico,比如android开发者社区(juapk)图标网址是:http://www.juapk.com/favicon.ico