首页 > 代码库 > JBPM学习(三):管理流程定义

JBPM学习(三):管理流程定义

概念:

ProcessDefinition,流程定义:一个流程的步骤说明,如一个请假流程、报销流程、是一个规则。

ProcessDefinition,流程定义对象,是解析.jpdl.xml文件得到流程步骤的信息。没有更新操作,启动流程实例时是使用指定key的最新的版本。

 

1.部署流程定义

a)一次添加一个资源,相关文件在Classpath

// 1,部署流程定义(添加)
	// jbpm4_deployment
	// jbpm4_deployprop
	// jbpm4_lob
	@Test
	public void deploy_1() {
		String deploymentId = processEngine.getRepositoryService()//
				.createDeployment()//创建一个部署对象,Deployment:一次部署的信息,含有多个文件
				.addResourceFromClasspath("helloworld/test.jpdl.xml")//往Deployment对象添加资源
				.addResourceFromClasspath("helloworld/test.png")//
				.deploy();//执行部署
		System.out.println("deploymentId = " + deploymentId);
	}

b)一次添加多个资源,多个资源先打成zip

@Test
	public void deploy_2() {
		// 找到zip文件
		InputStream in = this.getClass().getClassLoader().getResourceAsStream("helloworld/helloworld.zip");
		ZipInputStream zipInputStream = new ZipInputStream(in);

		// 部署
		String deploymentId = processEngine.getRepositoryService()//
				.createDeployment()//
				.addResourcesFromZipInputStream(zipInputStream)//
				.deploy();
		System.out.println("deploymentId = " + deploymentId);
	}

c)说明

1, addResourceFromClasspath(resource); 可以调用多次以添加多个文件。文件重复添加也不会报错。

2, addResourceFromInputStream(resourceName, inputStream)添加一个文件(使用InputStream

3, addResourcesFromZipInputStream(zipInputStream)添加多个文件,里面也可以有文件夹。

4, 以上方法可以在一起调用。

2.查询所有流程定义

a) 查询所有流程定义

@Test
	public void findAll() {
		// 查询
		List<ProcessDefinition> list = processEngine.getRepositoryService()//
				.createProcessDefinitionQuery()//
				.orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//排序条件
				//.count()查询出总数量
				//.page(0, 100)分页,取出前100条记录
				.list();

		// 显示
		for (ProcessDefinition pd : list) {
			System.out.println("id=" + pd.getId()// 格式为:{key}-{version}
					+ ", name=" + pd.getName()// 流程定义文件(.jpdl.xml)中根元素的name属性的值
					+ ", key=" + pd.getKey()// 流程定义文件(.jpdl.xml)中根元素的key属性的值,可以不写,不写就是name属性的值
					+ ", version=" + pd.getVersion()// 流程定义文件(.jpdl.xml)中根元素的version属性的值,可以不写,不写就会自增(key相同时,版本加1)
					+ ", deploymentId=" + pd.getDeploymentId()); // 本流程定义对应的 .jpdl.xml 文件所属的Deployment对象的id
		}
	}

b) 查询所有最新版本的流程定义

@Test
	public void findAllLatestVersions() {
		// 1,查询所有流程定义,按Version升序排列,这样所有最大的版本就都排到最后了
		List<ProcessDefinition> allList = processEngine.getRepositoryService()//
				.createProcessDefinitionQuery()//
				.orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)//
				// .processDefinitionName("test")//
				// .orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//
				// .orderDesc(ProcessDefinitionQuery.PROPERTY_KEY)//
				// .uniqueResult()
				// .count()
				// .page(firstResult, maxResults)
				.list();

		// 2,过滤出所需的最新版本的流程定义
		Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>();
		for (ProcessDefinition pd : allList) {
			map.put(pd.getKey(), pd);//不同的key会保存最新的版本(上面已经按版本升序排列)
		}

		// 显示
		for (ProcessDefinition pd : map.values()) {
			System.out.println("id=" + pd.getId()// 格式为:{key}-{version}
					+ ", name=" + pd.getName()// 流程定义文件(.jpdl.xml)中根元素的name属性的值
					+ ", key=" + pd.getKey()// 流程定义文件(.jpdl.xml)中根元素的key属性的值,可以不写,不写就是name属性的值
					+ ", version=" + pd.getVersion()// 流程定义文件(.jpdl.xml)中根元素的version属性的值,可以不写,不写就会自增(key相同时,版本加1)
					+ ", deploymentId=" + pd.getDeploymentId()); // 本流程定义对应的 .jpdl.xml 文件所属的Deployment对象的id
		}
	}

3.删除流程定义(其实是删除Deployment)

a) 删除某个Deployment

@Test
	public void deleteById() {
		String deploymentId = "1";
		// // 删除某Deployment,如果有关联的执行信息,就抛异常
		// processEngine.getRepositoryService().deleteDeployment(deploymentId);
		// 删除某Deployment,如果有关联的执行信息,就级联删除
		processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);
	}

b) 删除指定key的所有版本的流程定义

@Test
	public void deleteByKey() {
		// 1,查询出指定key的所有版本的流程定义
		List<ProcessDefinition> list = processEngine.getRepositoryService()//
				.createProcessDefinitionQuery()//
				.processDefinitionKey("helloworld")//
				.list();

		// 2,循环删除
		for (ProcessDefinition pd : list) {
			processEngine.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());
		}
	}

4.获取部署时的某文件的资源(查看流程图)

a) 查看流程图

@Test
	public void getResourceFromDeployment() throws Exception {
		String deploymentId = "50001";
		String resourceName = "helloworld/test.png"; // 指定的是 jbpm4_lob 表中的name_列的值

		// 获取某Deployment中所有文件资源的名称
		Set<String> names = processEngine.getRepositoryService().getResourceNames(deploymentId);
		for (String name : names) {
			System.out.println(name);
		}

		// 获取某Deployment中指定名称的资源
		InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);

		// 保存到"c:/"中
		OutputStream out = new FileOutputStream("c:/process.png");
		for (int b = -1; (b = in.read()) != -1;) {
			out.write(b);
		}
		in.close();
		out.close();
	}

5.获取流程图中某活动的坐标(不重要)

String processDefinitionId = "test-1"; // 流程定义的id
	String activityName = "start1"; // 活动的名称
	ActivityCoordinates c = processEngine.getRepositoryService().getActivityCoordinates(processDefinitionId, activityName);
	System.out.println("x=" + c.getX() 
			+ ",y=" + c.getY() 
			+ ",width=" + c.getWidth() 
			+ ",height=" + c.getHeight());