zoukankan      html  css  js  c++  java
  • activiti学习4:流程文件的部署

    activiti学习4:流程文件的部署

    用bpmn规范定义好一个流程得到流程定义文件后,需要把该文件部署到activiti的数据库后,这个流程才可以使用。

    activiti中和流程定义相关的操作都需要使用RepositoryService这个服务组件来进行。

    activiti中所有的服务组件都需要通过流程引擎对象来获取

    一、RepositoryService服务组件

    这个组件中提供了一系列管理流程定义和流程部署的api,我们可以使用这个组件中的api来部署流程

    1.1 RepositoryService实例对象的获取

    使用流程引擎对象的实例方法processEngine.getRepositoryService();来获取RepositoryService

    	@Test
    	public void test1() {
    		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    		RepositoryService repositoryService = processEngine.getRepositoryService();
    		System.out.println(repositoryService);
    	}
    

    二、流程部署信息的描述,Deployment对象

    在讲解如何部署流程前,我们先了解下activiti如何描述流程的部署信息。activiti用Deployment这个接口来描述流程的部署信息,并自己提供了实现类。对应activiti数据库中的一张表ACT_RE_DEPLOYMENT

    三、流程的部署

    activiti使用DeploymentBuilder这个类的对象来部署流程,从这个类的名字就可以看出它的功能,部署一个流程并返回描述这次部署信息的对象。

    使用RepositoryService服务组件的对象来获取DeploymentBuilder对象

    DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
    

    然后给这个deploymentBuilder添加要部署的流程文件的位置

    deploymentBuilder.addClasspathResource("process/process.bpmn");
    

    我这里是在resources目录下创建了process/process.bpmn流程定义文件,所以添加了这个路径

    还可以为本次部署添加名称和分类

    deploymentBuilder.name("vacation-test").category("test");
    

    最后执行部署

    Deployment deploy = deploymentBuilder.deploy();
    

    观察数据库ACT_RE_DEPLOYMENT表,会发现多了一条部署记录。

    完整的代码为

    	@Test
    	public void test1() {
    		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    		RepositoryService repositoryService = processEngine.getRepositoryService();
    		DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
    		deploymentBuilder.addClasspathResource("process/process.bpmn");
    		deploymentBuilder.name("vacation-test").category("test");
    		Deployment deploy = deploymentBuilder.deploy();
    		System.out.println(deploy);
    	}
    

    注意,默认情况下多次部署同一流程图在表中会产生多条记录,用部署时间字段用来做区分

    3.1 过滤重复部署的问题

    为了防止资源没有发生变化而再次执行部署方法产生的重复部署,可以调用DeploymentBuilder的enableDuplicateFiltering()方法,这里的过滤方式是先查询部署表,得到表中已有的部署对象集合,如果发现有一条部署记录与将要部署的对象相同,就不会重复部署。所以部署时设置的name,category,资源名称和内容,只要有一个不一样就不会被过滤掉

    deploymentBuilder.enableDuplicateFiltering();//设置过滤重复部署
    

    四、部署信息的管理

    activiti在DeploymentQuery这个接口中封装了管理部署信息的api,并自己提供了实现类,通过repositoryService服务组件来获取其实现类对象。

    DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
    

    4.1 查询部署信息

    @Test
    	public void test2() {
    		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    		RepositoryService repositoryService = processEngine.getRepositoryService();
    		DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
    		//根据deploymentId查询
    		String deploymentId="4201";
    		Deployment singleResult = deploymentQuery.deploymentId(deploymentId)
    				.deploymentName("vacation-test").singleResult();
    		System.out.println(singleResult);
    	}
    

    查询时,先给deploymentQuery对象拼接查询条件,这里支持链式编程,先一个个的拼接查询条件,最后这个

    singleResult()方法执行查询,返回一个结果;如果根据设定的条件返回多个结果,调用singleResult()就会抛出异常,这时需要调用返回多个结果的查询方法list()

    4.2 删除部署信息

    因为部署信息表与其他表有外键关联,所以直接删除部署表中的数据是删不掉的,需要调用RepositoryService中的删除方法来删除

    	@Test
    	public void test3() {
    		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    		RepositoryService repositoryService = processEngine.getRepositoryService();
    		String deploymentId="4201";
    		boolean cascade=true;
    		repositoryService.deleteDeployment(deploymentId, cascade);
    	}
    

    其中第2个参数cascade表示是否级联删除其他表的数据,直接给true就可以

    五、流程定义及其管理

    5.1 流程定义信息的描述

    一个流程文件部署成功后,不仅会在部署表中记录部署信息,同时也会在流程定义表act_re_procdef中添加一条流程定义信息,描述被部署的流程文件所定义的流程。

    注意其中的这个KEY_字段对应的就是流程定义文件中的process节点的id,activiti开启流程时要使用这个字段。

    <process id="process" isExecutable="true">
        <startEvent id="sid-26F630F1-0761-4247-8383-F63F913A310E"></startEvent>
        <userTask id="usertask1" name="apply vecation" activiti:assignee="kermit"></userTask>
        <sequenceFlow id="sid-85398367-B674-473A-B7AC-268635F0DF5D" sourceRef="sid-26F630F1-0761-4247-8383-F63F913A310E" targetRef="usertask1"></sequenceFlow>
        <userTask id="usertask2" name="manager agree" activiti:assignee="kermit"></userTask>
        <sequenceFlow id="sid-5372C6B1-7359-40AB-B0A4-3FF06F20790E" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
        <endEvent id="sid-F621C8EF-13A5-4A49-BD5B-708BFB066576"></endEvent>
        <sequenceFlow id="sid-BCF9087D-36F4-4EDE-BD88-013AC74AB93A" sourceRef="usertask2" targetRef="sid-F621C8EF-13A5-4A49-BD5B-708BFB066576"></sequenceFlow>
      </process>
    

    和部署信息一样,activiti也有一个接口来描述这张表的信息,ProcessDefinition,并自己提供了实现类

    5.2 流程定义信息的管理

    activiti提供了ProcessDefinitionQuery这个接口,在其中封装了流程定义信息查询相关的api。查询对象的获取和使用与DeploymentQuery类似。

    	@Test
    	public void test1() {
    		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    		RepositoryService repositoryService = processEngine.getRepositoryService();
    		ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
    		String processDefinitionKey="process";
    		List<ProcessDefinition> list = processDefinitionQuery.processDefinitionKey(processDefinitionKey).list();
    		for (ProcessDefinition processDefinition : list) {
    			System.out.println(processDefinition);
    		}
    	}
    

    六、总结

    本文介绍了如何部署流程定义文件,以及对部署后生成的部署信息和流程定义信息的管理。

  • 相关阅读:
    10. Regular Expression Matching
    9. Palindrome Number
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
    2. Add Two Numbers
    链式表的按序号查找
    可持久化线段树——区间更新hdu4348
    主席树——树链上第k大spoj COT
  • 原文地址:https://www.cnblogs.com/chengxuxiaoyuan/p/12005362.html
Copyright © 2011-2022 走看看