【Activiti工作流】7.流程定义的CRUD(下)

上一篇我们学习了工作流定义的操作,包括:
1.管理流程定义(流程图)
2.部署流程定义(classpath路径加载文件)
3.查看流程定义
4.删除流程定义


也即是,我们学习了流程的增加/查看/删除,接下来我们继续学习流程的
其它操作。

我们讲解了流程的增加/查看/删除,那么流程定义有修改吗?
答案是没有。

原因是:
举个例子,我们创建了流程图,并且定义了一系列流程信息:


这个流程执行了一段时间之后,我们想取消“部门经理审批”的
流程,提交的申请直接由总经理审批,此时的流程图应为:


在这个流程的设计阶段我们这么做是没有问题的,但是一旦这个
流程是启动过的,而且使用过一段时间,我们就无法把它给直接
去掉,会影响整个项目的运行。所以流程定义是无法修改的。

我们想修改这个流程妥善的办法是,在原来的流程基础上,我们
将修改后的流程重新发布一个版本,覆盖之前的版本,我们再次
启动的时候,就启动的是最新版的流程:

可以看到,我们的流程定义ID和流程定义的版本都有所变化,在之前
的状态上加一。

所以我们的工作流的修改的策略是:使用流程定义的Key相同的情况下,
进行版本升级。

我们接下来做一些有关版本控制的实例:
1.查询最新版本的流程定义
假设目前我们系统中有两个流程定义,它们有各自的版本:

我们要运行流程的时候,应该获取每一个流程的最新版本:


我们的策略就是,使用map来装每一个流程定义对象:

我们将取出的流程定义对象使用升序排列,巧妙的使用相同Key,
不同Value的替换,将会把最后一个取出来的最新版本的信息放入
map,覆盖了之前的版本对象:
/**查看最新版本的流程定义*/
@Test
public void queryAllLatestVersions(){
	RepositoryService repositoryServic=processEngine.getRepositoryService();
	ProcessDefinitionQuery query=repositoryServic.createProcessDefinitionQuery();
	//先做一个升序排列
	List<ProcessDefinition> list=query.orderByProcessDefinitionVersion().asc() //使用版本升序排序
										   .list();//获取流程定义对象List集合
	
	/**
	 * Map<String,ProcessDefinition>
	 * map集合的key:流程定义的key
	 * map集合的value:流程定义的对象
	 * map集合的特点:当map集合key值相同的情况下,后一次的值将替换前一次的值
	 * */
	Map<String,ProcessDefinition> map=new LinkedHashMap<String,ProcessDefinition>();
	if(list!=null&&list.size()>0){
		for(ProcessDefinition pd:list){
			map.put(pd.getKey(), pd);
		}
	}
	
	List<ProcessDefinition> pdList=new ArrayList<ProcessDefinition>(map.values());
	//遍历集合,查看内容
	for (ProcessDefinition pd:pdList) {
		System.out.println("id:"+pd.getId());
		System.out.println("name:"+pd.getName());
		System.out.println("key:"+pd.getKey());
		System.out.println("version:"+pd.getVersion());
		System.out.println("resourceName:"+pd.getDiagramResourceName());
		System.out.println("###########################################");
	}
}
运行效果:


我们之前不进行控制的时候,查询到的是所有的版本:


可以看到,我们这里取出了最新版本的流程定义对象。


2.删除key相同的所有不同版本的流程定义
我们的流程定义可能有多个版本,我们一般的删除是制定流程定义
对象的id来进行删除的话,如果我们要彻底删除一个流程定义,那就
要把该流程定义的所有版本全部删除。
/**删除key相同的所有不同版本的流程定义*/
@Test
public void deleteProcessDefinitionByKey(){
	//流程定义的key
	String processDefinitionKey = "HelloWorld";
	//先使用流程定义的key查询流程定义,查询出所有的版本
	RepositoryService repositoryServic=processEngine.getRepositoryService();
	ProcessDefinitionQuery query=repositoryServic.createProcessDefinitionQuery();
	List<ProcessDefinition> list=query.processDefinitionKey(processDefinitionKey).list();
	
	//遍历,获取每个流程定义的部署ID
	if(list!=null&&list.size()>0){
		for(ProcessDefinition pd:list){
			//获取部署ID
			String deploymentId = pd.getDeploymentId();
			processEngine.getRepositoryService()
						 .deleteDeployment(deploymentId,true);//级联删除
		}
	}
}
执行之后,查看数据库就会发现什么也没有了。


总结:
eployment   部署对象
1、一次部署的多个文件的信息。对于不需要的流程可以删除和修改。
2、对应的表:
  act_re_deployment:部署对象表
  act_re_procdef:流程定义表
  act_ge_bytearray:资源文件表
  act_ge_property:主键生成策略表

ProcessDefinition 流程定义
1、解析.bpmn后得到的流程定义规则的信息,工作流系统就是按照流程定义的规则执行的。
转载请注明出处:http://blog.csdn.net/acmman/article/details/61630259
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值