Activiti学习之入门:流程定义(05)

一、流程定义部署

1.1 流程定义

流程定义:定义了流程每个节点的描述以及节点之间的流程流转。
将线下定义的流程部署到activiti数据库中,这就是流程定义部署,通过廖勇activiti的api将流程定义的bpmn和png两个文件一个一个添加部署到activiti中,也可以将两个文件打成zip包进行部署。

1.2 单个文件部署方式

@Test
    public void test() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 获取repositoryservice
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // bpmn输入流
        InputStream inputStream_bpmn = this
                .getClass()
                .getClassLoader()
                .getResourceAsStream("diagram/holiday.bpmn20.xml");
        // 图片输入流
        InputStream inputStream_png = this
                .getClass()
                .getClassLoader()
                .getResourceAsStream("diagram/holiday.png");
        // 流程部署对象
        Deployment deployment = repositoryService.createDeployment()
                .addInputStream("holiday.bpmn20.xml", inputStream_bpmn)
                .addInputStream("holiday.png", inputStream_png)
                .name("请假流程")
                .deploy();
        System.out.println("流程部署id:" + deployment.getId());
        System.out.println("流程部署名称:" + deployment.getName());
    }

执行次操作后activiti会将上边代码中指定的bpmn文件和图片保存在activiti数据库中。

1.3 压缩包部署方式

将 holiday.bpmn 和 holiday.png 压缩成 zip 包。

      @Test
    public void test2(){
        //1、创建ProcessEngine对象
        ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
        // 定义zip输入流
        InputStream inputStream = this
                .getClass()
                .getClassLoader()
                .getResourceAsStream("diagram/holidayBPMN.zip");
        ZipInputStream zipInputStream = new ZipInputStream(inputStream);
        // 获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 流程部署
        Deployment deployment = repositoryService.createDeployment()//
                .addZipInputStream(zipInputStream).name("请假").deploy();

        System.out.println("流程部署id:" + deployment.getId());
        System.out.println("流程部署名称:" + deployment.getName());
    }  

执行次操作后activiti会将上边代码中指定的bpm文件和图片保存在activiti数据库。

1.4 操作数据表

流程定义部署后操作activiti数据表如下:
act_re_deployment # 流程定义部署表,记录流程部署信息
act_re_procdef # 流程定义表,记录流程定义信息
act_ge_bytearray # 资源表
说明:
act_re_deployment和act_re_procdef一对多关系,一次部署在流程部署表中生成一条记录,单一次部署可以部署多个流程定义,每个流程定义在流程定义表生成一条记录。每一个流程定义在act_ge_batearray会存在两个资源记录,bpmn和png。

二、流程定义查询

查询部署的流程定义:

    @Test
    public void test3(){
        // 流程定义key
        String processKey="holiday";
        // 获取reposotoryService
        ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService=processEngine.getRepositoryService();

        ProcessDefinitionQuery processdefinitionquery=repositoryService.createProcessDefinitionQuery();

        List<ProcessDefinition> list=processdefinitionquery.processDefinitionKey(processKey)
                .orderByProcessDefinitionVersion().desc().list();
        for(ProcessDefinition processDefinition:list){
            System.out.println("------------------------");
            System.out.println(" 流 程 部 署 id : " +
                    processDefinition.getDeploymentId());
            System.out.println("流程定义id:" + processDefinition.getId());
            System.out.println("流程定义名称:" + processDefinition.getName());
            System.out.println("流程定义key:" + processDefinition.getKey());
            System.out.println("流程定义版本:" + processDefinition.getVersion());
        }


    }

三、流程定义删除

删除已经部署成功的流程定义:

    @Test
    public void test4(){
        //流程部署id
        String deploymentId="7501";
        //通过流程引擎获取repositoryService
        ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService=processEngine.getRepositoryService();
        //删除流程定义,如果该流程定义已有流程实例启动则删除
        repositoryService.deleteDeployment(deploymentId);
        //repositoryService.deleteDeployment(deploymentId,true);
    }    

说明:

  • 使用repositoryService删除流程定义
  • 如果该流程定义下没有正在运行的流程,则可以用普通删除。
  • 如果该流程定义下存在已经运行的流程,使用普通删除报错,可用级联删除方法将流程以及相关记录全部删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使用。

四、流程定义资源查询

4.1 方式一

通过流程定义对象获取流程定义资源,获取bpmn和png。

  @Test
    public void test5() throws IOException {
        // 流程定义id
        String processDefinitionId = "holiday:1:2504";
        // 获取repositoryService
        ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine
                .getRepositoryService();
        // 流程定义对象
        ProcessDefinition processDefinition = repositoryService
                .createProcessDefinitionQuery()
                .processDefinitionId(processDefinitionId).singleResult();
        //获取bpmn
        String resource_bpmn = processDefinition.getResourceName();
        //获取png
        String resource_png =
                processDefinition.getDiagramResourceName();
        // 资源信息
        System.out.println("bpmn:" + resource_bpmn);
        System.out.println("png:" + resource_png);
        File file_png = new File("d:/purchasingflow01.png");
        File file_bpmn = new File("d:/purchasingflow01.bpmn");
        // 输出bpmn
        InputStream resourceAsStream = null;
        resourceAsStream = repositoryService.getResourceAsStream(
                processDefinition.getDeploymentId(), resource_bpmn);

        FileOutputStream fileOutputStream = new FileOutputStream(file_bpmn);

        byte[] b = new byte[1024];
        int len = -1;
        while ((len = resourceAsStream.read(b, 0, 1024)) != -1) {
            fileOutputStream.write(b, 0, len);
        }
        // 输出图片
        resourceAsStream = repositoryService.getResourceAsStream(
                processDefinition.getDeploymentId(), resource_png);
        fileOutputStream = new FileOutputStream(file_png);
        // byte[] b = new byte[1024];
        // int len = -1;
        while ((len = resourceAsStream.read(b, 0, 1024)) != -1) {
            fileOutputStream.write(b, 0, len);
        }

    }  

4.2 方式二

通过查询流程部署信息获取流程定义资源。

     @Test
    public void test6() throws IOException {
        //流程部署id
        String deploymentId = "2501";
        // 通过流程引擎获取repositoryService
        ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine
                .getRepositoryService();
        //读取资源名称
        List<String> resources =
                repositoryService.getDeploymentResourceNames(deploymentId);
        String resource_image = null;
        //获取图片
        for(String resource_name :resources){
            if(resource_name.indexOf(".png")>=0){
                resource_image = resource_name;
            }
        }

        //图片输入流
        InputStream inputStream =
                repositoryService.getResourceAsStream(deploymentId, resource_image);
        File exportFile = new File("d:/holiday.png");
        FileOutputStream fileOutputStream = new
                FileOutputStream(exportFile);
        byte[] buffer = new byte[1024];
        int len = -1;
        //输出图片
        while((len = inputStream.read(buffer))!=-1){
            fileOutputStream.write(buffer, 0, len);
        }
        inputStream.close();
        fileOutputStream.close();
    }

说明:

  • deplomentId 为流程部署ID
  • resource_name 为act_ge_bytearray表中的NAME_列的值
  • 使用 repositoryService 的 getDeploymentResourceNames方法可以获取指定部署下得所有文件的名称
  • 使用 repositoryService 的 getResourceAsStream 方法传入部署 ID和资源图片名称可以获取部署下指定名称文件的输入流

五、流程历史信息的查看

即使流程定义已经删除了,流程执行的历史信息通过前面的分析,依然保存在activiti的act_hi_*相关的表中。所以我们还是可以查询流程执行的历史信息,可以通过HistoryService来查看相关的历史记录。

    @Test
    public void test7() {
        ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
        HistoryService historyService = processEngine.getHistoryService();
        HistoricActivityInstanceQuery query =
                historyService.createHistoricActivityInstanceQuery();
        query.processInstanceId("7501");

        List<HistoricActivityInstance> list = query.list();
        for(HistoricActivityInstance ai :list){
            System.out.println(ai.getActivityId());
            System.out.println(ai.getActivityName());
            System.out.println(ai.getProcessDefinitionId());
            System.out.println(ai.getProcessInstanceId());
            System.out.println("==============================");
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值