Activiti进阶(二)--流程变量

Avtiviti

----流程变量(Variables)

 

上篇博文我们对基本得流程框架得开发做了基本得解释,包括得到流程对象得三种基本方式,从流程得部署,开始,到完成都进行得代码得解释等等,详细大家对工作流已经不再陌生,本篇文章将对工作流当中得流程变量,进行介绍,之后得文章会对流程得部署方式,流程的网关等进行介绍。

那么我们首先看:

 

流程变量是什么?

  • 在流程实例运行过程中,难免要记录或者保存一些数据,然后运行到某个节点的时候,取数据查看,或者是后面学到流程分支的时候 判断流程走向,都要用到一些数据存储。
  • 流程变量,顾名思义就是流程中用来存储数据的变量;
  • Activiti中基本支持所有的基本数据类型作为流程变量以及支持序列化对象,所以也可以存一个对象
  • 根据一个流程定义可以启动很多流程实例,每个流程实例里的流程变量都是独立的,互不影响

主要用途:

在执行流程的过程中,传递参数。

接下来我们来将流程变量加入来开发整个流程:

首先我们依旧的线画好图:

 

如上图所示,这个流程主要包括四部分,

开始----leave----审批-------结束

整个流程的id是:Stuprocess(之后就是用这个key来开启线程)

我们将这个文件复制,然后将它的后缀改为.xml我们就可以看到这张图的信息,因为bpmn文件其本质就是xml文件;

具体的信息如下:

 

 

 

 

这是主要的头部信息,余下的是坐标这里就不解释了,因为上一篇文章有详细的介绍,在这里我们只看关键信息,如:

id=Stuprocess

第一个节点任务是leave操作的人是傅蕤

第二个节点的任务是审批,操作的人是父王

然后以前以后就是开始和结束节点;

这就是这个图所要描述的信息;

了解了基的任务信息之后,我们就来进行流程的部署:

 

  1. deploy

当然在部署之前我们首先要得到的就是,流程引擎对象:

 

我们用之前提到的第三种方式,

 

ProcessEngine pe= ProcessEngines.getDefaultProcessEngine();

底层自动取加载配置文件,配置文件,如下:


 
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.springframework.org/schema/beans   

      http://www.springframework.org/schema/beans/spring-beans.xsd">



    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">

        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db_activiti?characterEncoding=utf-8"></property>

        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>

        <property name="jdbcUsername" value="root"></property>

        <property name="jdbcPassword" value="root2"></property>

        <property name="databaseSchemaUpdate" value="true"></property>

    </bean>

</beans>
注意:使用这种方式配置文件的文件名必须是:activiti.cfg.xml

因为底层加载的就是这个名字;

 

配置文件完成的就两个任务,数据库的连接以及自动更新表的设置

 

然后我们就来部署:

public void deploy(){

得到部署的服务对象:

    RepositoryService repositoryService = pec.getRepositoryService()
部署任务
  Deployment deploy = repositoryService.createDeployment()
将整个图作为资源加入

            .addClasspathResource("Variables.bpmn")
这个任务部署的名字是请假

            .name("请假")
开始部署

            .deploy();
打印部署的id

    System.out.println("部署id+:"+deploy.getId());

}

部署完成之后我们可以在部署表中看见部署的信息,以及在定义表当中看到Stuprocess key的定义;

以上的画图以及部署只需要做一些次就还可以,因为他们是可以重复使用的;

这里再上篇文章当中有详细的价绍,这里就不再赘述;

start

再部署完成之后,我们就要启动我们部署好的任务

 

2 下面是启动的代码:

 

public void startAct(){
得到运行时service
    RuntimeService runtimeService = pec.getRuntimeService();

更具关键字启动我们的流程
    ProcessInstance stuProcess = runtimeService.startProcessInstanceByKey("StuProcess");

打印初流程定义的id以及流程实例的id
    System.out.println("流程实例id:"+stuProcess.getId());
    System.out.println("流程定义id:"+stuProcess.getProcessDefinitionId());
}

 

在启动完成之后,我们在任务表当中我们就可以看到,我们部署的流程的第一个任务;

 

在这里我们就可以加入流程变量了,流程变量可以在运行时加也可以在完成任务的时候加

用的就是:runService和TaskService两个服务对象,这里我们在完成任务的时候来加这个变量。

 

 

3.完成

 

在这接招两种加入流程变量的方法:

一种是直接设置值

一种是通过map的方式来添加值

由上图我们在源码当中可以看到的就是,完成的这个方法其内部是id和map集合来构成的

所以在完成任务的这个地方我们可以用两这方式来添加流程变量

 

但是在启动的时候也是可以的,下面是启动的源码:

它里面同样是可以来放置集合的;

此处我们在完成任务的时候来选择添加流程变量:

下面就是两种添加方式的代码:

public  void complete1(){



        TaskService taskService = pec.getTaskService();
首先,完成一个任务我们需要知道它的任务id,这个我们可以在启动之后的任务表当中看的到,就是它的主键
我们将其设置为一个字符串变量,来供后面使用

        String taskId="42503";
灰色的部分用的就是set方法来设置变量的

//        taskService.setVariable(taskId,"days",7);

//        taskService.setVariable(taskId,"reason","要去赚钱");

//        Student student=new Student(1,"傅往");

//        taskService.setVariable(taskId,"Student",student);
下面黑色的部分就是用集合的方式来设置流程变量的

        Map<String, Object> variables=new HashMap<>();

        variables.put("days",7);

        taskService.complete(taskId,variables);

    }

完成之后我们的请假惹任务就完成了,接下来就是审批任务,之前的文章这说到过,就是当我们的一个任务完成了,这个任务就从我们的任务表当消失了,而在历史表当中会有它的记录,对于它的时间我们也进行过详细的分析,大家可以取看前一篇博文;

 

这样我们就完成了第一个节点的任务;

接下来任务表当中出现的就是下一个任务,审批任务;

注意:在任务表当中,同一个流程的任务除了并状态下会都出现之外,一般同一流程的任务只会由一个,当然不同的人员操作虽然都是请假,但是他们的信息是不一样的,所以不能算是同一个;

 

 

接下来我们来完成第二个任务审批

 

//老师完成审批

    public  void complete2(){

同样审批也应该有的就是任务服务对象以及新产生审批任务的id

        TaskService taskService = pec.getTaskService();

        String taskId="42503";
在这里我们可以得到前面在完成第一个任务时设置的流程变两的值:

        int days = (int)taskService.getVariable(taskId, "days");

//        String reason = (String) taskService.getVariable(taskId, "reason");

//        Student student = (Student)taskService.getVariable(taskId, "Student");

//        System.out.println("天数"+days+"====="+"理由"+reason+"======"+"申请人"+student.getName());

        System.out.println("天数==="+days);

        taskService.complete(taskId);

    }

那么流程变量的值得到之后有什么作用呢?

主要有两个作用:

  1. 就是可以当作流程判断的条件值,因为真的流出是少不了判断的,在这里我们只是用简单的来做演示而已;
  2. 就是可以供操作者来,参考决策,在于前端整合之后就可以以界面的形式将这些信息显示出来了;

以上就是流程变量的作用以及关于他的一些基本操作;

下篇博文将会为大家介绍,流程部署的第二种方式,以及流程线设置判断和网关的概念

敬请期待!!!!!

展开阅读全文

没有更多推荐了,返回首页