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


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

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

  • 删除流程定义
  • 删除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());
            }
        }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,631评论 18 399
  • activity一共23张表 表的命名第一部分都是以 ACT_开头的。 表的命名第二部分是一个两个字符用例表的标识...
    年轻人Moriarty阅读 13,323评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • 一. Java基础部分.................................................
    wy_sure阅读 3,811评论 0 11
  • 那一年,你20岁,我19岁,我们在开往古城的火车上相遇。你告诉我,你是一名调酒师,你爱调酒。我告诉你,我马上大二,...
    未可_Win阅读 313评论 0 5