Activiti7工作流引擎入门

Activiti7工作流引擎入门

流程的定义

  1. 创建 src/main/resources/diagram/holiday.bpmn 文件

  2. 画流程图

  3. 将holiday.bpmn文件复制后重命名为holiday.xml

  4. 右键 使用Diagrams --> SHOW BPMN 2.0 Desinger 查看 holiday.xml 文件

  5. 将图片holiday.png保存到src/main/resources/diagram/目录中

流程的部署

package com.hellogitee.activiti;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;

/**
 * 流程定义的部署
 * 表 
 * act_re_deployment
 * act_re_procdef
 * act_ge_bytearray
 */

public class ActivitiDeployment {

    // 流程部署
    public static void main(String[] args) {
        // 1、创建ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2、得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();

        // 3、进行部署
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("diagram/holiday.bpmn") //添加bpmn资源
                .addClasspathResource("diagram/holiday.png")    //添加图片资源
                .name("请假申请单流程")
                .deploy();// 部署

        // 4、输出部署的一些信息
        System.out.println("流程部署id:" + deployment.getId());
        System.out.println("流程部署名称:" + deployment.getName());

    }

}

压缩包部署方式

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

public void deployProcessByZip() {
    // 定义zip输入流
        InputStream inputStream = this.getClass()
                .getClassLoader()
                .getResourceAsStream("diagram/holiday.zip");
        ZipInputStream zipInputStream = new ZipInputStream(inputStream);
        // 获取repositoryService

        RepositoryService repositoryService = ProcessEngines.getDefaultProcessEngine()
                .getRepositoryService();
        // 流程部署
        Deployment deployment = repositoryService.createDeployment()
                .addZipInputStream(zipInputStream)
                .deploy();
        System.out.println("流程部署id:" + deployment.getId());
        System.out.println("流程部署名称:" + deployment.getName());
    }

启动流程实例

启动流程实例:前提是先已经完成流程定义的部署工作

**
 * 启动流程实例:前提是先已经完成流程定义的部署工作
 * 影响的表:
 * act_hi_actinst       已完成的活动信息
 * act_hi_identitylink 参与者信息
 * act_hi_procinst      流程实例
 * act_hi_taskinst      任务实例
 * act_ru_execution     执行表
 * act_ru_identitylink  参与者信息
 * act_ru_task          任务
 */

public class ActivitiStartInstance {

    public static void main(String[] args) {
        // 1. 得到 ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 得到 RunServer对象
        RuntimeService runtimeService = processEngine.getRuntimeService();

        // 3.创建流程实例
        ProcessInstance processInstance=  runtimeService.startProcessInstanceByKey("holiday");
        // 4. 输出实例相关信息
        System.out.println("流程定义ID " + processInstance.getProcessDefinitionId());
        System.out.println("流程实例ID " + processInstance.getId());
        System.out.println("流程活动ID " + processInstance.getActivityId());

    }
}

查询当前个人待执行的任务

/**
 *  查询当前用户的列表
 */

public class ActivitiTaskQuery{
    
    public static void main(String[] args) {
    
        // 1. 得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2. 得到 TaskService 对象
        TaskService taskService = processEngine.getTaskService();

        // 3. 根据流程定义的key,负责人assignee来实现当前用户的任务列表查询
        List list = taskService.createTaskQuery()
                .processDefinitionKey("holiday")
                .taskAssignee("zhangsan")
                .list();

        // 4. 任务列表的展示
        for (Task task:list) {
            System.out.println();
            System.out.println("流程实例ID: " + task.getProcessInstanceId());
            System.out.println("任务id: " + task.getId());
            System.out.println("任务负责人: " + task.getAssignee());
            System.out.println("任务名称: " + task.getName());
        }
    }
}

// 任务处理

public class ActivitiTaskCompletTask {


    public static void main(String[] args) {

        // 1. 得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2. 得到 TaskService 对象
        TaskService taskService = processEngine.getTaskService();

        // 3. 处理任务,结合当前用户任务列表的查询操作,找到任务ID
        taskService.complete(taskService.createTaskQuery()
                .processDefinitionKey("holiday")
                .taskAssignee("zhangsan")
                .singleResult()
                .getId()
        );
    }
}

查询流程定义信息


/**
 * 查询流程定义信息
 */

public class QueryProcessDefinition {

    public static void main(String[] args) {
        // 1.得到ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2.得到 RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();

        // 3. 得到ProcessDefinitioQuery对象,可以认为他就是一个查询器
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();

        // 4.设置条件,并查询出当前的所有流程定义,查询条件:流程定义的key = holiday
        List list = processDefinitionQuery.processDefinitionKey("holiday")
                .orderByProcessDefinitionVersion()
                .desc().list();

        // 5. 输出流程定义信息
        for (ProcessDefinition processDefinition:list) {
            System.out.println("流程定义的ID: " + processDefinition.getId());
            System.out.println("流程定义的名称: " + processDefinition.getName());
            System.out.println("流程定义的key: " + processDefinition.getKey());
            System.out.println("流程定义的版本号: " + processDefinition.getVersion());
            System.out.println("流程部署ID: " + processDefinition.getDeploymentId());

        }
    }
}

删除已经部署的流程定义

/**
 * 删除已经部署的流程定义
 */

public class DeleteProcessDefinition {

    public static void main(String[] args) {
        // 1.得到ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2.得到 RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();

        // 3.删除流程定义,参数代表流程部署的id
        //删除流程定义,如果该流程定义已有流程实例启动则删除时出错
        repositoryService.deleteDeployment("1");
        //设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除
        // repositoryService.deleteDeployment("1",true);
        

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

将两个资源文件保存到本地

/**
 * 需求:
 *      1.从Activiti的act_ge_bytearay表中读取两个资源文件
 *      2. 将两个资源文件保存到本地
 * 用户需要知道这个流程具体有哪些步骤要走
 */
public class QueryBpmnFile {

    public static void main(String[] args) throws IOException {
        // 1.得到ProcessEngine对象
        ProcessEngine drocessEngine = ProcessEngines.getDefaultProcessEngine();

        // 2.得到RepositoryService对象
        RepositoryService repositoryService = drocessEngine.getRepositoryService();

        // 3.得到查询器:ProcessDefinitionQuery对象
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        // 4.设置查询条件
        processDefinitionQuery.processDefinitionKey("holiday");

        // 5.执行查询操作,查询出想要的流程定义
        ProcessDefinition processDefinition = processDefinitionQuery.singleResult();

        // 6.通过流程定义信息,得到部署ID
        String deploymentId = processDefinition.getDeploymentId();

        // 7.通过repositoryServicce方法,实现读取图片信息及bpmn文件信息(输入流)

        // getResourceAsStream()方法参数说明: 第一个参数部署id,第二个参数代表资源名称
        // processDefinition.getDiagramResourceName() 代表获取png图片资源的名称
        InputStream pngIs = repositoryService
                .getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());

        // processDefinition.getResourceName()  代表获取bpm文件资源的名称
        InputStream bpmnIs = repositoryService
                .getResourceAsStream(deploymentId, processDefinition.getResourceName());

        // 8.构造出OutputStream
        FileUtils.forceMkdirParent(new File("/home/aj/IdeaProjects/filedownload/" + processDefinition.getDiagramResourceName()));
        FileUtils.forceMkdirParent(new File("/home/aj/IdeaProjects/filedownload/" + processDefinition.getResourceName()));
        OutputStream pngOs =
                new FileOutputStream(
                        new File("/home/aj/IdeaProjects/filedownload/" + processDefinition.getDiagramResourceName()));
        OutputStream bpmnOs =
                new FileOutputStream(
                        new File("/home/aj/IdeaProjects/filedownload/" + processDefinition.getResourceName()));

        // 9.输入流,输出流的转换 commons-io **.jar 中的方法
        IOUtils.copy(pngIs,pngOs);
        IOUtils.copy(bpmnIs,bpmnOs);

        // 10.关闭流
        pngOs.close();
        bpmnOs.close();
        pngIs.close();
        bpmnIs.close();
    }
}

流程历史信息的查看

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

/**
 * 历史数据查看
 */
public class QueryHistory {

    public static void main(String[] args) {
        //1. 得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2. 得到HistoryService
        HistoryService historyService = processEngine.getHistoryService();

        // 3. 得到HistoricActivityInstanceQuery对象
        HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
        historicActivityInstanceQuery.processInstanceId("2501")
                .orderByHistoricActivityInstanceStartTime()
                .asc();

        // 4. 执行查询
        List list = historicActivityInstanceQuery.list();

        // 5. 遍历查询结果
        for(HistoricActivityInstance instance : list){

            System.out.println(instance.getActivityId());
            System.out.println(instance.getActivityName());
            System.out.println(instance.getProcessDefinitionId());
            System.out.println(instance.getProcessInstanceId());
            System.out.println("==============================");
        }


    }
}

你可能感兴趣的:(Activiti7工作流引擎入门)