Activiti就是这么简单(三)

简介: Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务 流程图。.

3.3获取流程实例的状态


有的时候,我们需要判断它是在该流程,还是该流程已经结束了。我们可以根据获取出来的对象是否为空来进行判断


//获取流程实例的状态
    @Test
    public void getProcessInstanceState(){
        String processInstanceId="605";
        ProcessInstance pi = processEngine.getRuntimeService()
                .createProcessInstanceQuery()
                .processInstanceId(processInstanceId)
                .singleResult();//返回的数据要么是单行,要么是空 ,其他情况报错
        //判断流程实例的状态
        if(pi!=null){
            System.out.println("该流程实例"+processInstanceId+"正在运行...  "+"当前活动的任务:"+pi.getActivityId());
        }else{
            System.out.println("当前的流程实例"+processInstanceId+" 已经结束!");
        }
    }

15.jpg这里写图片描述



3.4查看历史流程实例的信息


//查看历史执行流程实例信息
    @Test
    public void queryHistoryProcInst(){
        List<HistoricProcessInstance> list = processEngine.getHistoryService()
        .createHistoricProcessInstanceQuery()
        .list();
        if(list!=null&&list.size()>0){
            for(HistoricProcessInstance temp:list){
                System.out.println("历史流程实例id:"+temp.getId());
                System.out.println("历史流程定义的id:"+temp.getProcessDefinitionId());
                System.out.println("历史流程实例开始时间--结束时间:"+temp.getStartTime()+"-->"+temp.getEndTime());
            }
        }
    }

查询表:

16.jpg这里写图片描述17.jpg这里写图片描述


3.5查看历史实例执行任务信息


@Test
    public void queryHistoryTask(){
        String processInstanceId="605";
        List<HistoricTaskInstance> list = processEngine.getHistoryService()
                .createHistoricTaskInstanceQuery()
                .processInstanceId(processInstanceId)
                .list();
        if(list!=null&&list.size()>0){
            for(HistoricTaskInstance temp:list){
                System.out.print("历史流程实例任务id:"+temp.getId());
                System.out.print("历史流程定义的id:"+temp.getProcessDefinitionId());
                System.out.print("历史流程实例任务名称:"+temp.getName());
                System.out.println("历史流程实例任务处理人:"+temp.getAssignee());
            }
        }
    }

给予对应的实例id就可以查询出执行到哪个任务了…

18.jpg这里写图片描述19.jpg这里写图片描述


3.6执行任务


根据任务的id,就可以把该任务执行了。

@Test
    public void compileTask(){
        String taskId="608";
        //taskId:任务id
        processEngine.getTaskService().complete(taskId);
        System.out.println("当前任务执行完毕");
    }


四、流程变量细讲


流程变量涉及到的数据库表:

act_ru_variable:正在执行的流程变量表
act_hi_varinst:流程变量历史表

流程变量在工作流中扮演着一个非常重要的角色。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。

20.png这里写图片描述


4.1设置流程变量


我们有两种服务可以设置流程变量,TaskService【任务服务】和RuntimeService【运行时服务】

场景

  • 在流程开始的时候设置流程变量
  • 在完成某个任务的时候设置流程变量
  • 使用TaskService设置服务
  • 使用RuntimeService设置服务

作用:

  • 传递业务参数
  • 动态指定代理人【我们快速入门的例子是固定在流程定义图上写上代理人的】
  • 指定连接【决定流程往哪边走】


4.2流程变量支持类型


如果我们使用JavaBean来作为流程的变量,那么我们需要将JavaBean实现Serializable接口

Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID

21.png

这里写图片描述


4.3setVariable和setVariableLocal的区别


22.jpg这里写图片描述


4.4例子


//模拟流程变量设置
    @Test
    public void  getAndSetProcessVariable(){
        //有两种服务可以设置流程变量
//        TaskService taskService = processEngine.getTaskService();
//        RuntimeService runtimeService = processEngine.getRuntimeService();
        /**1.通过 runtimeService 来设置流程变量
         * executionId: 执行对象
         * variableName:变量名
         * values:变量值
         */
//        runtimeService.setVariable(executionId, variableName, values);
//        runtimeService.setVariableLocal(executionId, variableName, values);
        //设置本执行对象的变量 ,该变量的作用域只在当前的execution对象
//        runtimeService.setVariables(executionId, variables); 
          //可以设置多个变量  放在 Map<key,value>  Map<String,Object>
        /**2. 通过TaskService来设置流程变量
         * taskId:任务id
         */
//        taskService.setVariable(taskId, variableName, values);
//        taskService.setVariableLocal(taskId, variableName, values);
////        设置本执行对象的变量 ,该变量的作用域只在当前的execution对象
//        taskService.setVariables(taskId, variables); //设置的是Map<key,values>
        /**3. 当流程开始执行的时候,设置变量参数
         * processDefiKey: 流程定义的key
         * variables: 设置多个变量  Map<key,values>
         */
//        processEngine.getRuntimeService()
//        .startProcessInstanceByKey(processDefiKey, variables)
        /**4. 当任务完成时候,可以设置流程变量
         * taskId:任务id
         * variables: 设置多个变量  Map<key,values>
         */
//        processEngine.getTaskService().complete(taskId, variables);
        /** 5. 通过RuntimeService取变量值
         * exxcutionId: 执行对象
         * 
         */
//        runtimeService.getVariable(executionId, variableName);//取变量
//        runtimeService.getVariableLocal(executionId, variableName);//取本执行对象的某个变量
//        runtimeService.getVariables(variablesName);//取当前执行对象的所有变量
        /** 6. 通过TaskService取变量值
         * TaskId: 执行对象
         * 
         */
//        taskService.getVariable(taskId, variableName);//取变量
//        taskService.getVariableLocal(taskId, variableName);//取本执行对象的某个变量
//        taskService.getVariables(taskId);//取当前执行对象的所有变量
    }
//设置流程变量值
    @Test
    public void setVariable(){
        String taskId="1804";//任务id
        //采用TaskService来设置流程变量
        //1. 第一次设置流程变量
//        TaskService taskService = processEngine.getTaskService();
//        taskService.setVariable(taskId, "cost", 1000);//设置单一的变量,作用域在整个流程实例
//        taskService.setVariable(taskId, "申请时间", new Date());
//        taskService.setVariableLocal(taskId, "申请人", "何某某");//该变量只有在本任务中是有效的
        //2. 在不同的任务中设置变量
//        TaskService taskService = processEngine.getTaskService();
//        taskService.setVariable(taskId, "cost", 5000);//设置单一的变量,作用域在整个流程实例
//        taskService.setVariable(taskId, "申请时间", new Date());
//        taskService.setVariableLocal(taskId, "申请人", "李某某");//该变量只有在本任务中是有效的
        /**
         * 3. 变量支持的类型
         * - 简单的类型 :String 、boolean、Integer、double、date 
         * - 自定义对象bean  
         */
        TaskService taskService = processEngine.getTaskService();
        //传递的一个自定义bean对象
        AppayBillBean appayBillBean=new AppayBillBean();
        appayBillBean.setId(1);
        appayBillBean.setCost(300);
        appayBillBean.setDate(new Date());
        appayBillBean.setAppayPerson("何某某");
        taskService.setVariable(taskId, "appayBillBean", appayBillBean);
        System.out.println("设置成功!");
    }
//查询流程变量
    @Test
    public void getVariable(){
        String taskId="1804";//任务id
//        TaskService taskService = processEngine.getTaskService();
//        Integer cost=(Integer) taskService.getVariable(taskId, "cost");//取变量
//        Date date=(Date) taskService.getVariable(taskId, "申请时间");//取本任务中的变量
////        Date date=(Date) taskService.getVariableLocal(taskId, "申请时间");//取本任务中的变量
//        String appayPerson=(String) taskService.getVariableLocal(taskId, "申请人");//取本任务中的变量
////        String appayPerson=(String) taskService.getVariable(taskId, "申请人");//取本任务中的变量
//        
//        System.out.println("金额:"+cost);
//        System.out.println("申请时间:"+date);
//        System.out.println("申请人:"+appayPerson);
        //读取实现序列化的对象变量数据
        TaskService taskService = processEngine.getTaskService();
        AppayBillBean appayBillBean=(AppayBillBean) taskService.getVariable(taskId, "appayBillBean");
        System.out.println(appayBillBean.getCost());
        System.out.println(appayBillBean.getAppayPerson());
    }
public class AppayBillBean  implements Serializable{
    private Integer id;
    private Integer cost;//金额
    private String appayPerson;//申请人
    private Date date;//申请日期
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getCost() {
        return cost;
    }
    public void setCost(Integer cost) {
        this.cost = cost;
    }
    public String getAppayPerson() {
        return appayPerson;
    }
    public void setAppayPerson(String appayPerson) {
        this.appayPerson = appayPerson;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
}
目录
相关文章
|
7月前
|
XML 数据可视化 安全
一文了解Activiti7
一文了解Activiti7
154 0
|
数据可视化 Java 关系型数据库
01-认识Activiti
类似如请假、离职、出差、报销这种有审批流程的业务,我们都可以称之为工作流(也叫流程引擎),它可以帮助用户实现一个审批流程的可视化,借助于工作流引擎可以搭建客户关系管理系统(CRM)、运输管理系统(TMS)、仓储管理系统(WMS)、财务费用系统等多种复杂业务系统。
114 0
|
7月前
|
XML Java API
Activiti应用
Activiti应用
99 0
|
安全 Java 测试技术
Activiti-Activiti整合篇
Activiti-Activiti整合篇
Activiti-Activiti整合篇
|
架构师 应用服务中间件 API
Activiti就是这么简单(四)
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务 流程图。.
228 0
Activiti就是这么简单(四)
|
架构师 Java 应用服务中间件
Activiti就是这么简单(一)
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务 流程图。.
398 0
Activiti就是这么简单(一)
|
架构师 应用服务中间件 Apache
Activiti就是这么简单(二)
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务 流程图。.
216 0
Activiti就是这么简单(二)
|
XML 数据格式
Activiti 6.x【11】IntermediateEvent
版权声明:转载注明出处就OK的说,有些东西会转载,都会注明的说= =如果有冒犯麻烦见谅 https://blog.csdn.net/Pan1458689676/article/details/82728835 ...
1758 0
|
XML 数据格式
Activiti 6.x【10】BoundaryEvent【下】
版权声明:转载注明出处就OK的说,有些东西会转载,都会注明的说= =如果有冒犯麻烦见谅 https://blog.csdn.net/Pan1458689676/article/details/82720556 ...
2521 0
|
XML 数据格式
Activiti 6.x【8】EndEvent
版权声明:转载注明出处就OK的说,有些东西会转载,都会注明的说= =如果有冒犯麻烦见谅 https://blog.csdn.net/Pan1458689676/article/details/82711607 ...
1603 0