【Activiti 基础篇三】流程定义—CRUD操作

看到这个标题,我们首先得明确两个概念:

1、何为流程定义?

在我们创建Activiti的过程中,创建.pbmn文件是必不可少的,当创建完之后,点击保存,会生成一个.png文件。这两个合起来就是所谓的流程定义。

2、何为CRUD?

CRUD其实就是我们最常用的增删改查操作,全拼:CreateReadUpdateDelete。所以本篇则是和大家一起分享一下关于流程定义的增删改查操作。


  首先在操作的前提还是要明确对于获取流程引擎对象是必不可少的,定义如下:

// 获取流程引擎(核心对象),默认加载
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  为什么必不可少呢!通过转定义的方式一一点入,就会发现其实最终他也是要读取配置文件的,点击getDefaultProcessEngine转定义进入如图:

 在点击init()进入,如图:

  因为最终还是会读取到配置文件的,而且在Init()执行方法时会进行判断是否是初始化,如果是初始化,才会继续进行,否则直接读取则可。在一切准备就绪之后,我们来一一进行操作

一:Create(部署流程定义)

关于部署流程定义:本篇讲述两种方式,一种直接读取法,一种ZIP读取法

直接读取法:

// 完成部署流程定义
	@Test
	public void deploymentProcessDefinition() {
		// 将其赋值给部署对象
		Deployment deployment = processEngine.getRepositoryService() // 获取流程定义和部署对象相关的service
				.createDeployment() // 创建部署对象
				.name("helloworld演示") // 声明流程的名称
				.addClasspathResource("diagrams/helloworld.bpmn") // 加载资源文件,一次只能加载一个文件
				.addClasspathResource("diagrams/helloworld.png").deploy(); // 完成部署
		// 输出显示
		System.out.println("部署ID:" + deployment.getId()); // 输出部署的id
		System.out.println("部署时间:" + deployment.getDeploymentTime()); // 输出部署的时间
	}

zip读取法:

 将.bpmn文件和.png文件放入文件,压缩然后再放入项目中

// 完成部署流程定义(zip)
	@Test
	public void deploymentProcessDefinition_zip() {
		// 获取压缩文件
		InputStream in = this.getClass().getClassLoader()
				.getResourceAsStream("diagrams/helloworld.zip");
		// 定义
		ZipInputStream zipInputStream = new ZipInputStream(in);
		// 将其赋值给部署对象
		Deployment deployment = processEngine.getRepositoryService() // 获取流程定义和部署对象相关的service
				.createDeployment() // 创建部署对象
				.name("helloworld演示") // 声明流程的名称
				.addZipInputStream(zipInputStream) // 使用zip方式部署
				.deploy();
		System.out.println("部署ID:" + deployment.getId()); // 输出部署的id
		System.out.println("部署时间:" + deployment.getDeploymentTime()); // 输出部署的时间
	}

二:Read(查看流程定义)

// 查询流程定义
	@Test
	public void findProcessDifinitionList() {
		// 流程定义
		List<ProcessDefinition> list = processEngine.getRepositoryService() // 获取流程定义和部署对象相关的service
				.createProcessDefinitionQuery() // 创建查询
				.processDefinitionKey("helloworld") // 按照流程定义的key值查询
				// 排序
				.orderByProcessDefinitionVersion().desc() // 按照流程版本排序
				// 返回结果
				.list();
		// 对list集合进行判断
		if (list != null && list.size() > 0) {
			for (ProcessDefinition pd : list) {
				System.out.println("流程定义的ID:" + pd.getId()); // 由流程定义的key+":"+版本+":"+生成的id,可以表示流程定义的唯一值
				System.out.println("流程定义的名称:" + pd.getName()); // 对应helloworld.bpmn文件中name属性值
				System.out.println("流程定义的key:" + pd.getKey()); // 对应helloworld.bpmn文件中id属性值,用来对应每个流程
				System.out.println("流程定义的部署ID:" + pd.getDeploymentId());
				System.out.println("流程定义的资源名称:" + pd.getResourceName());
				System.out.println("流程定义的版本:" + pd.getVersion()); // 当流程定义的key相同的情况下,版本是升级的
				System.out
						.println("##########################################");
			}
		}
	}
  其实查询这可以根据流程定义ID,KEY模糊查询等,也可以根据多条件排序,各种类型输出等。

三:Update(编辑流程定义)

  对于工作流来说,流程定义的操作是没有编辑可言的,举例来说:

我们之前计划流程为三步,提交申请,经理审批,总经理审批三个节点,如图:


假设我现在的三个节点的流程基本信息为:

流程定义的ID:helloworld:1:101

流程定义的key:helloworld

流程定义的版本:1

  但是后来又发觉有点太过于麻烦,所以总经理最后决定,以后这种请假的事情直接由经理来审批就行,所以我们最后的流程修改成了两步:


两个节点的流程基本信息为:

流程定义的ID:helloworld:2:101

流程定义的key:helloworld

流程定义的版本:2

  通过数据库也能区分开了,每次不管是否流程更换,增添或者减少节点,都是一个流程定义的key重新部署的过程,每次启动流程实例,他都会按照最新版本启动,所以在流程定义这,并没有修改的过程,只有版本的定义。

四:Delete(删除流程定义)

// 删除流程定义
	@Test
	public void deleteProcessDifinition() {
		String deploymentId = "301";
		/**
		 * deleteDeployment(deploymentId) //使用部署ID删除流程定义
		 * 注意:删除流程部署到数据库,没有启动时,可以删除的。
		 */
		/*
		 * processEngine.getRepositoryService() // 获取流程定义和部署对象相关的service
		 * .deleteDeployment(deploymentId); // 使用部署ID删除流程定义
		 *//**
		 * deleteDeployment(deploymentId) //使用部署ID删除流程定义
		 * 注意:不管流程是否启动,都可以进行级联删除
		 */
		processEngine.getRepositoryService() // 获取流程定义和部署对象相关的service
				.deleteDeployment(deploymentId, true); // 使用部署ID删除流程定义,true表示级联删除
		System.out.println("删除成功!");
	}
  删除流程定义,需要注意是否是级联查询,转定义deleteDeployment进去,就会发现,有一个布尔值的属性默认为false,如图:


  默认是非级联查询的,所以如果想彻底的删除,不管流程启动与否,我们只需要在参数后加一个"true"则可。最后输出结果"删除成功",查询数据库,相关信息已经删除干净。

  以上就是对于流程定义的CRUD操作进行简单的了解,所以的操作其实都是来源于基本操作,比如查询把最新版本信息,删除key相同的流程定义等,所以基础还是至关重要的。

posted on 2016-01-11 21:31  huohuoL  阅读(310)  评论(0编辑  收藏  举报

导航