美文网首页
Activiti7工作流引擎入门

Activiti7工作流引擎入门

作者: 阿杰_96c5 | 来源:发表于2020-03-07 21:23 被阅读0次

    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<Task> 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<ProcessDefinition> 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<HistoricActivityInstance> 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工作流引擎入门

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