美文网首页
Activiti工作流框架——控制操作流程

Activiti工作流框架——控制操作流程

作者: 年轻人Moriarty | 来源:发表于2017-02-26 18:40 被阅读0次

    • 部署流程定义
    • 启动流程实例

    • 查询流程定义
    • 查询最新版本的流程定义
    • 查询流程实例状态
    • 导出流程图到文件夹下

    • 删除流程定义
    • 删除key相同的所有不同版本的流程定义

    • 设置流程变量
    • 获取流程变量

    • 查询历史任务
    • 查询历史流程实例
    • 查询历史流程变量
    • 查询历史活动

    部署流程定义

    • classpath方式
    Deployment deployment = processEngine.getRepositoryService()// 与流程定义和部署对象相关的Service
                    .createDeployment()// 创建一个部署对象
                    .name("开工")// 添加部署的名称
                    .addClasspathResource("diagrams/Process_1.bpmn")// 从classpath的资源中加载,一次只能加载一个文件
                    .addClasspathResource("diagrams/Process_1.png")// 从classpath的资源中加载,一次只能加载一个文件
                    .deploy();// 完成部署
            System.out.println("部署ID:" + deployment.getId());
            System.out.println("部署名称:" + deployment.getName());
    
    • zip方式
    InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloword.zip");
            ZipInputStream zipInputStream = new ZipInputStream(in);
            Deployment deployment = processEngine.getRepositoryService()// 与流程定义和部署对象相关的Service
                    .createDeployment()// 创建一个部署对象
                    .name("流程定义")// 添加部署的名称
                    .addZipInputStream(zipInputStream)// 指定zip格式的文件完成部署
                    .deploy();// 完成部署
            System.out.println("部署ID:" + deployment.getId());
            System.out.println("部署名称:" + deployment.getName());
    

    使用key启动流程实例

    String processDefinitionKey = "process_1";// 流程定义的key,对应helloworld.bpmn文件中id的属性值
            // 使用key值启动,默认是按照最新版本的流程定义启动
            
            ProcessInstance pi = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
                    .startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例
            System.out.println("流程实例ID:" + pi.getId());//
            System.out.println("流程定义ID:" + pi.getProcessDefinitionId());//
    

    查询流程定义

    • 通过流程定义ID、部署对象ID、流程定义的key以及流程定义的名称查询
    • 按照流程定义的key、版本、名称、ID、分类以及后缀ID升序或者降序排序
    • 返回的结果集是:一个集合列表、唯一的结果集、结果集的数量、分页查询
    List<ProcessDefinition> list = processEngine.getRepositoryService()// 与流程定义和部署对象相关的Service
                    .createProcessDefinitionQuery()// 创建一个流程定义的查询
    
                    /** 指定查询条件,where条件 */
                    .processDefinitionId("流程定义ID")// 使用流程定义ID查询
                    // .deploymentId(deploymentId)//使用部署对象ID查询
                    // .processDefinitionKey(processDefinitionKey)//使用流程定义的key查询
                    // .processDefinitionNameLike(processDefinitionNameLike)//使用流程定义的名称模糊查询
    
                    /** 排序 */
                    .orderByProcessDefinitionKey()// 按照流程定义的key
                    // .orderByProcessDefinitionVersion()// 按照流程定义的版本
                    // .orderByProcessDefinitionName()//按照流程定义的名称
                    // .orderByProcessDefinitionId()//按照流程定义的ID排列
                    // .orderByProcessDefinitionCategory()//按照流程定义的分类
                    // .orderByDeploymentId()//按照流程定义的后缀ID
    
                    .asc()// 升序排序
                    // .desc()//降序排序
    
                    /** 返回的结果集 */
                    .list();// 返回一个集合列表,封装流程定义
            // .singleResult();//返回惟一结果集
            // .count();//返回结果集数量
            // .listPage(firstResult, maxResults);//分页查询
    
            if (list != null && list.size() > 0) {
                for (ProcessDefinition pd : list) {
                    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());
                }
            }
    

    查询最新版本的流程定义

    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("#########################################################");
                }
            }
    

    查询流程实例状态

    • 已经结束
    • 没有结束
    ProcessInstance processInstance = processEngine.getRuntimeService()// 表示正在执行的流程实例和执行对象
                    .createProcessInstanceQuery()// 创建流程实例查询
                    .processInstanceId("流程实例ID")// 使用流程实例ID查询
                    .singleResult();
            if (processInstance == null) {
                System.out.println("流程已经结束");
            } else {
                System.out.println("流程没有结束");
            }
    

    导出流程图到文件夹下

    /** 将生成图片放到文件夹下 */
            String deploymentId = "流程部署ID";// 流程部署ID
            // 获取图片资源名称
            List<String> list = processEngine.getRepositoryService()//
                    .getDeploymentResourceNames(deploymentId);// 流程部署ID
            // 定义图片资源的名称
            String resourceName = "图片资源的名称";
            if (list != null && list.size() > 0) {
                for (String name : list) {
                    if (name.indexOf(".png") >= 0) {
                        resourceName = name;
                    }
                }
            }
            // 获取图片的输入流
            InputStream in = processEngine.getRepositoryService()//
                    .getResourceAsStream(deploymentId, resourceName);
            // 将图片生成到D盘的目录下
            File file = new File("C:/Users/Administrator/Desktop/新建文件夹diagrams/" + resourceName);
            // 将输入流的图片写到D盘下
            FileUtils.copyInputStreamToFile(in, file);
    

    删除流程定义

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

    删除key相同的所有不同版本的流程定义

    // 流程定义的key
            String processDefinitionKey = "process_1";
            // 先使用流程定义的key查询流程定义,查询出所有的版本
            List<ProcessDefinition> list = processEngine.getRepositoryService()//
                    .createProcessDefinitionQuery()//
                    .processDefinitionKey(processDefinitionKey)// 使用流程定义的key查询
                    .list();
            // 遍历,获取每个流程定义的部署ID
            if (list != null && list.size() > 0) {
                for (ProcessDefinition pd : list) {
                    // 获取部署ID
                    String deploymentId = pd.getDeploymentId();
                    processEngine.getRepositoryService()//
                            .deleteDeployment(deploymentId, true);
                }
            }
    

    设置流程变量

    • 使用基本数据类型
                    // 任务服务
            TaskService taskService = processEngine.getTaskService();
            // 任务ID
            String taskId = "任务ID";
            /** 一:设置流程变量,使用基本数据类型 */
            taskService.setVariableLocal(taskId, "请假天数", 5);// 与任务ID绑定
            taskService.setVariable(taskId, "请假日期", new Date());
            taskService.setVariable(taskId, "请假原因", "回家探亲,一起吃个饭");
    
    • 使用Javabean类型

    当一个javabean(实现序列号)放置到流程变量中,要求javabean的属性不能再发生变化 * 如果发生变化,再获取的时候,抛出异常,解决方案:在Person对象中添加: private static final long erialVersionUID = 6757393795687480331L; 同时实现Serializable

    import java.io.Serializable;
    /*
     * 序列化
     */
    public class Person implements Serializable {
        /*
         * 固定化
         */
        private static final long serialVersionUID = -5526993420322301104L;
        private int id;// 编号
        private String name;// 名称
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    
    // 任务服务
            TaskService taskService = processEngine.getTaskService();
            // 任务ID
            String taskId = "任务ID";
    
            Person p = new Person();
            p.setId(20);
            p.setName("翠花");
            taskService.setVariable(taskId, "人员信息(添加固定版本)", p);
    
    

    获取流程变量

    • 基本数据类型
    /** 任务服务 */
            TaskService taskService = processEngine.getTaskService();
            // 任务ID
            String taskId = "任务ID";
    
            /** 一:获取流程变量,使用基本数据类型 */
            Integer days = (Integer) taskService.getVariable(taskId, "请假天数");
            Date date = (Date) taskService.getVariable(taskId, "请假日期");
            String resean = (String) taskService.getVariable(taskId, "请假原因");
            System.out.println("请假天数:" + days);
            System.out.println("请假日期:" + date);
            System.out.println("请假原因:" + resean);
    
    • Javabean类型
    /** 任务服务 */
            TaskService taskService = processEngine.getTaskService();
            // 任务ID
            String taskId = "2904";
    
            /** 二:获取流程变量,使用javabean类型 */
            Person p = (Person) taskService.getVariable(taskId, "人员信息(添加固定版本)");
            System.out.println("id:" + p.getId());
            System.out.println("name:" + p.getName());
    

    查询历史任务

    String processInstanceId = "流程实例ID";// 流程实例ID
            List<HistoricTaskInstance> list = processEngine.getHistoryService()// 与历史数据(历史表)相关的Service
                    .createHistoricTaskInstanceQuery()// 创建历史任务实例查询
                    .processInstanceId(processInstanceId)//
                    .orderByHistoricTaskInstanceStartTime().asc().list();
            if (list != null && list.size() > 0) {
                for (HistoricTaskInstance hti : list) {
                    System.out.println(hti.getId() + "    " + hti.getName() + "    " + hti.getProcessInstanceId() + "   "
                            + hti.getStartTime() + "   " + hti.getEndTime() + "   " + hti.getDurationInMillis());
                }
            }
    

    查询历史流程实例

    String processInstanceId = "流程实例ID";
            HistoricProcessInstance hpi = processEngine.getHistoryService()// 与历史数据(历史表)相关的Service
                    .createHistoricProcessInstanceQuery()// 创建历史流程实例查询
                    .processInstanceId(processInstanceId)// 使用流程实例ID查询
                    .orderByProcessInstanceStartTime().asc().singleResult();
            System.out.println(hpi.getId() + "    " + hpi.getProcessDefinitionId() + "    " + hpi.getStartTime() + "    "
                    + hpi.getEndTime() + "     " + hpi.getDurationInMillis());
    

    查询历史流程变量

    String processInstanceId = "流程实例ID";// 流程实例ID
            List<HistoricVariableInstance> list = processEngine.getHistoryService()//
                    .createHistoricVariableInstanceQuery()// 创建一个历史的流程变量查询对象
                    .processInstanceId(processInstanceId)//
                    .list();
            if (list != null && list.size() > 0) {
                for (HistoricVariableInstance hvi : list) {
                    System.out.println(hvi.getId() + "   " + hvi.getProcessInstanceId() + "   " + hvi.getVariableName()
                            + "   " + hvi.getVariableTypeName() + "    " + hvi.getValue());
                }
            }
    

    查询历史活动

    String processInstanceId = "流程实例ID";//流程实例ID
            List<HistoricActivityInstance> list = processEngine.getHistoryService()//
                    .createHistoricActivityInstanceQuery()// 创建历史活动实例的查询
                    .processInstanceId(processInstanceId)//
                    .orderByHistoricActivityInstanceStartTime().asc()//
                    .list();
            if (list != null && list.size() > 0) {
                for (HistoricActivityInstance hai : list) {
                    System.out.println(hai.getId() + "   " + hai.getProcessInstanceId() + "   " + hai.getActivityType()
                            + "  " + hai.getStartTime() + "   " + hai.getEndTime() + "   " + hai.getDurationInMillis());
                }
            }
    

    相关文章

      网友评论

          本文标题:Activiti工作流框架——控制操作流程

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