美文网首页
3.activiti管理流程定义

3.activiti管理流程定义

作者: _少年不知愁 | 来源:发表于2018-08-16 10:14 被阅读0次

    1.部署流程定义

     Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
                    .createDeployment()//创建一个部署对象
                    .name("测试Helloword1")//添加部署的名称
                    .addClasspathResource("diagrams/helloworld.bpmn")//从classpath的资源中加载,一次只能加载一个文件
                    .addClasspathResource("diagrams/helloworld.png")//从classpath的资源中加载,一次只能加载一个文件
                    .deploy();//完成部署
    

    在创建时会自动加载classpath下的activiti.cfg.xml
    classpath路径加载文件
    a) act_re_deployment(部署对象表)
    存放流程定义的显示名和部署时间,每部署一次增加一条记录
    b) act_re_procdef(流程定义表)
    存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。
    注意:当流程定义的key相同的情况下,使用的是版本升级
    c) act_ge_bytearray(资源文件表)
    存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。
    2 使用zip部署流程

       @Test
       public void deploymentProcessDefinition() {
           RepositoryService repositoryService = processEngine.getRepositoryService();
           DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
           Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
                   .createDeployment()//创建一个部署对象
                   .name("测试Helloword1")//添加部署的名称
                   .addClasspathResource("diagrams/helloworld.bpmn")//从classpath的资源中加载,一次只能加载一个文件
                   .addClasspathResource("diagrams/helloworld.png")//从classpath的资源中加载,一次只能加载一个文件
                   .deploy();//完成部署
           System.out.println("部署ID:" + deployment.getId());//1
           System.out.println("部署名称:" + deployment.getName());//helloworld入门程序
           System.out.println(deployment);
       }
    
    

    3.查看流程定义
    看到流程定义的key值相同的情况下,版本是从1开始逐次升级的
    1)带有特定key的流程定义第一次部署时,version为1。之后每次部署都会在当前最高版本号上加1
    2)Id的值的生成规则为:{processDefinitionKey}:{processDefinitionVersion}:{generated-id}, 这里的generated-id是一个自动生成的唯一的数字
    3)重复部署一次,deploymentId的值以一定的形式变化
    规则act_ge_property表生成

        /**
         * 2 查看流程定义
         */
        @Test
        public void getQueryProcessDefinit() {
            List<ProcessDefinition> list = processEngine.getRepositoryService().createProcessDefinitionQuery().orderByProcessDefinitionVersion().asc().list();
            for (ProcessDefinition pro : list) {
                System.out.println("************************************");
                System.out.println("Id : " + pro.getId());
                System.out.println("name :" + pro.getName());
                System.out.println("key : " + pro.getKey());
                System.out.println("version : " + pro.getVersion());
                System.out.println("resource : " + pro.getResourceName());
            }
    
        }
    

    4.删除流程定义

        /**
         * 删除流程
         */
        @Test
        public void deleteDeployment() {
            //使用部署ID,完成删除
            String deploymentId = "1";
            /**
             * 不带级联的删除
             *    只能删除没有启动的流程,如果流程启动,就会抛出异常
             */
    //      processEngine.getRepositoryService()//
    //                      .deleteDeployment(deploymentId);
    
            /**
             * 级联删除
             *    不管流程是否启动,都能可以删除
             */
            processEngine.getRepositoryService()//
                    .deleteDeployment(deploymentId, true);
            System.out.println("删除成功!");
        }
    
    

    5.查询最新版本的流程定义

        @Test
        public void findLastVersionProcessDefinition(){
            List<ProcessDefinition> list = processEngine.getRepositoryService()//
                    .createProcessDefinitionQuery()//
                    .orderByProcessDefinitionVersion().asc()//使用流程定义的版本升序排列
                    .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());
            if(pdList!=null && pdList.size()>0){
                for(ProcessDefinition pd:pdList){
                    System.out.println("流程定义ID:"+pd.getId());//流程定义的key+版本+随机生成数
                    System.out.println("流程定义的名称:"+pd.getName());//对应helloworld.bpmn文件中的name属性值
                    System.out.println("流程定义的key:"+pd.getKey());//对应helloworld.bpmn文件中的id属性值
                    System.out.println("流程定义的版本:"+pd.getVersion());//当流程定义的key值相同的相同下,版本升级,默认1
                    System.out.println("资源名称bpmn文件:"+pd.getResourceName());
                    System.out.println("资源名称png文件:"+pd.getDiagramResourceName());
                    System.out.println("部署对象ID:"+pd.getDeploymentId());
                    System.out.println("#########################################################");
                }
            }
        }
    

    6.删除流程定义(删除key相同的所有不同版本的流程定义)

        /**
         * 删除 使用流程定义的key
         */
        @Test
        public void deleteByKey() {
            String key = "helloworld";
            List<ProcessDefinition> list = processEngine.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey(key).list();
    //        for (ProcessDefinition pd : list) {
    //
    //        }
            processEngine.getRepositoryService().deleteDeployment(list.get(0).getDeploymentId(), true);
        }
    

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

    ProcessDefinition 流程定义
    1、解析.bpmn后得到的流程定义规则的信息,工作流系统就是按照流程定义的规则执行的。

    相关文章

      网友评论

          本文标题:3.activiti管理流程定义

          本文链接:https://www.haomeiwen.com/subject/aapmbftx.html