初学activiti部署的两种方式、删除、查看最新版本、等基本操作

本文介绍了Activiti流程引擎的两种部署方式:单个文件部署和Zip包部署,并展示了如何删除部署、查询流程定义、查看最新版本及流程图。示例代码详细展示了数据库连接配置和相关API的使用。

1.不多说了直接上代码。都有注释。希望对新学习的小伙伴有所帮助。


package cn.com.agree.testactiviti;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@WebMvcTest(TestActivitiController.class)
public class TestActivitiController {

    /**部署流程定义*/
    @Test
    public void deploymentProcessDefinition(){
        
        //数据库连接
        ProcessEngineConfiguration config = ProcessEngineConfiguration
                                            .createStandaloneInMemProcessEngineConfiguration();
        config.setJdbcDriver("com.mysql.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://localhost:3306/activiti-demo?useUnicode=true&characterEncoding=utf8");
        config.setJdbcUsername("root");
        config.setJdbcPassword("root");
         /*
              DB_SCHEMA_UPDATE_FALSE 不能创建表,需要表存在
              DB_SCHEMA_UPDATE_TRUE 先删除表再创建表
              DB_SCHEMA_UPDATE_TRUE 如表不存在自动创建表
         */
        config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        ProcessEngine processEngine=config.buildProcessEngine();
        //与流程定义和部署对象相关的Service
        RepositoryService repositoryService=processEngine.getRepositoryService();
        
        DeploymentBuilder deploymentBuilder=repositoryService.createDeployment();//创建一个部署对象
        deploymentBuilder.name("helloWorld入门程序");//添加部署的名称
        deploymentBuilder.addClasspathResource("processes/MyProcess.bpmn");//从classpath的资源加载,一次只能加载一个文件
        deploymentBuilder.addClasspathResource("processes/MyProcess.png");//从classpath的资源加载,一次只能加载一个文件
        
        Deployment deployment=deploymentBuilder.deploy();//完成部署
        
        //打印我们的流程信息
        System.out.println("部署Id:"+deployment.getId());
        System.out.println("部署名称Name:"+deployment.getName());
    }
    /**部署流程定义(Zip)*/
    @Test
    public void deploymentProcessDefinitionZip(){
        //数据库连接
        ProcessEngineConfiguration config = ProcessEngineConfiguration
                                            .createStandaloneInMemProcessEngineConfiguration();
        config.setJdbcDriver("com.mysql.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://localhost:3306/activiti-demo?useUnicode=true&characterEncoding=utf8");
        config.setJdbcUsername("root");
        config.setJdbcPassword("root");
         /*
              DB_SCHEMA_UPDATE_FALSE 不能创建表,需要表存在
              DB_SCHEMA_UPDATE_TRUE 先删除表再创建表
              DB_SCHEMA_UPDATE_TRUE 如表不存在自动创建表
         */
        config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        ProcessEngine processEngine=config.buildProcessEngine();
        
        //获得上传文件的输入流程
        InputStream in=this.getClass().getClassLoader().getResourceAsStream("processes/processes.zip");
        ZipInputStream zipInputStream=new ZipInputStream(in);
        //获取仓库服务,从类路径下完成部署
        RepositoryService repositoryService=processEngine.getRepositoryService();
        DeploymentBuilder deploymentBuilder=repositoryService.createDeployment();//创建一个部署对象
        deploymentBuilder.name("helloWorld入门程序11");//添加部署的名称
        deploymentBuilder.addZipInputStream(zipInputStream);
        Deployment deployment=deploymentBuilder.deploy();//完成部署
        
        //打印我们的流程信息
        System.out.println("部署Id:"+deployment.getId());
        System.out.println("部署名称Name:"+deployment.getName());
    }
    
    /**查看流程定义
     *     id:(key):(version):(随机值)
     *     name:对应流程文件process节点的name属性
     *  key:对应流程文件process节点的id属性
     *  version:发布时自动生成的。如果是第一次发布的流程,version默认从1开始;
     *  如果当前流程引擎中已存在相同的流程,则找到当前key对应的最高版本号,在最高版本号上加1*/
    @Test
    public void queryProcessDefinition() throws Exception{
        //获取数据库连接
        ProcessEngineConfiguration config = ProcessEngineConfiguration
                                            .createStandaloneInMemProcessEngineConfiguration();
        config.setJdbcDriver("com.mysql.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://localhost:3306/activiti-demo?useUnicode=true&characterEncoding=utf8");
        config.setJdbcUsername("root");
        config.setJdbcPassword("root");
         /*
              DB_SCHEMA_UPDATE_FALSE 不能创建表,需要表存在
              DB_SCHEMA_UPDATE_TRUE 先删除表再创建表
              DB_SCHEMA_UPDATE_TRUE 如表不存在自动创建表
         */
        config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        ProcessEngine processEngine=config.buildProcessEngine();
        
        //获取仓库服务对象,使用版本的升级排列,查询列表
        List<ProcessDefinition> pdList=processEngine.getRepositoryService()
                                    .createProcessDefinitionQuery()
                                    //添加查询条件
                                    //.processDefinitionId(processDefinitionId)
                                    //.processDefinitionKey(processDefinitionKey)
                                    //.processDefinitionName(processDefinitionName)
                                    //排序(可以按照id/key/name/version/Cagetory排序)
                                    .orderByProcessDefinitionVersion().asc()
                                    //.count()
                                    //.listPage(firstResult, maxResults)
                                    //.singleResult()
                                    .list();//总的结果集数量
        //便利集合,查看内容
        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("###########################################");
        }
    }
    
    /**删除流程*/
    @Test
    public void deleteDeployment(){
        
        //获取数据库连接
        ProcessEngineConfiguration config = ProcessEngineConfiguration
                                            .createStandaloneInMemProcessEngineConfiguration();
        config.setJdbcDriver("com.mysql.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://localhost:3306/activiti-demo?useUnicode=true&characterEncoding=utf8");
        config.setJdbcUsername("root");
        config.setJdbcPassword("root");
         /*
              DB_SCHEMA_UPDATE_FALSE 不能创建表,需要表存在
              DB_SCHEMA_UPDATE_TRUE 先删除表再创建表
              DB_SCHEMA_UPDATE_TRUE 如表不存在自动创建表
         */
        config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        ProcessEngine processEngine=config.buildProcessEngine();
        
        //删除发布信息
        String deploymentId="1";
        //获取仓库服务对象
        RepositoryService repositoryService=processEngine.getRepositoryService();
        //普通删除,如果当前规则下有正在执行的流程,则抛异常
        repositoryService.deleteDeployment(deploymentId);
        //级联删除,会删除和当前规则相关的所有信息,正在执行的信息,也包括历史信息
        //repositoryService.deleteDeployment(deploymentId, true);
        System.out.println("删除成功"+deploymentId);
    }
    
    /**删除key相同的所有不同版本的流程定义*/
    @Test
    public void deleteProcessDefinitionByKey(){
        
        //获取数据库连接
        ProcessEngineConfiguration config = ProcessEngineConfiguration
                                            .createStandaloneInMemProcessEngineConfiguration();
        config.setJdbcDriver("com.mysql.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://localhost:3306/activiti-demo?useUnicode=true&characterEncoding=utf8");
        config.setJdbcUsername("root");
        config.setJdbcPassword("root");
         /*
              DB_SCHEMA_UPDATE_FALSE 不能创建表,需要表存在
              DB_SCHEMA_UPDATE_TRUE 先删除表再创建表
              DB_SCHEMA_UPDATE_TRUE 如表不存在自动创建表
         */
        config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        ProcessEngine processEngine=config.buildProcessEngine();
                
        
        //流程定义的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);//级联删除
            }
        }
    }
    
    /**查看最新版本的流程定义*/
    @Test
    public void queryAllLatestVersions(){
        //获取数据库连接
        ProcessEngineConfiguration config = ProcessEngineConfiguration
                                            .createStandaloneInMemProcessEngineConfiguration();
        config.setJdbcDriver("com.mysql.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://localhost:3306/activiti-demo?useUnicode=true&characterEncoding=utf8");
        config.setJdbcUsername("root");
        config.setJdbcPassword("root");
         /*
              DB_SCHEMA_UPDATE_FALSE 不能创建表,需要表存在
              DB_SCHEMA_UPDATE_TRUE 先删除表再创建表
              DB_SCHEMA_UPDATE_TRUE 如表不存在自动创建表
         */
        config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        ProcessEngine processEngine=config.buildProcessEngine();
        
        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.Myprocess.bpmn文件源码

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="myProcess" name="My process" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="提交申请" activiti:assignee="张三"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <userTask id="usertask2" name="审批【部门经理】" activiti:assignee="李四"></userTask>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <userTask id="usertask3" name="审批【总经理】" activiti:assignee="王五"></userTask>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
    <bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="160.0" y="180.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" x="240.0" y="170.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55.0" width="105.0" x="390.0" y="170.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
        <omgdc:Bounds height="55.0" width="105.0" x="540.0" y="170.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="690.0" y="180.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="195.0" y="197.0"></omgdi:waypoint>
        <omgdi:waypoint x="240.0" y="197.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="345.0" y="197.0"></omgdi:waypoint>
        <omgdi:waypoint x="390.0" y="197.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="495.0" y="197.0"></omgdi:waypoint>
        <omgdi:waypoint x="540.0" y="197.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
        <omgdi:waypoint x="645.0" y="197.0"></omgdi:waypoint>
        <omgdi:waypoint x="690.0" y="197.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

3.第一次写这个。写的不好。希望大家多多指教!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值