Avtiviti
----流程变量(Variables)
上篇博文我们对基本得流程框架得开发做了基本得解释,包括得到流程对象得三种基本方式,从流程得部署,开始,到完成都进行得代码得解释等等,详细大家对工作流已经不再陌生,本篇文章将对工作流当中得流程变量,进行介绍,之后得文章会对流程得部署方式,流程的网关等进行介绍。
那么我们首先看:
流程变量是什么?
- 在流程实例运行过程中,难免要记录或者保存一些数据,然后运行到某个节点的时候,取数据查看,或者是后面学到流程分支的时候 判断流程走向,都要用到一些数据存储。
- 流程变量,顾名思义就是流程中用来存储数据的变量;
- Activiti中基本支持所有的基本数据类型作为流程变量,以及支持序列化对象,所以也可以存一个对象
- 根据一个流程定义可以启动很多流程实例,每个流程实例里的流程变量都是独立的,互不影响
主要用途:
在执行流程的过程中,传递参数。
接下来我们来将流程变量加入来开发整个流程:
首先我们依旧的线画好图:
如上图所示,这个流程主要包括四部分,
开始----leave----审批-------结束
整个流程的id是:Stuprocess(之后就是用这个key来开启线程)
我们将这个文件复制,然后将它的后缀改为.xml我们就可以看到这张图的信息,因为bpmn文件其本质就是xml文件;
具体的信息如下:
这是主要的头部信息,余下的是坐标这里就不解释了,因为上一篇文章有详细的介绍,在这里我们只看关键信息,如:
id=Stuprocess
第一个节点任务是leave操作的人是傅蕤
第二个节点的任务是审批,操作的人是父王
然后以前以后就是开始和结束节点;
这就是这个图所要描述的信息;
了解了基的任务信息之后,我们就来进行流程的部署:
- 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);
}
那么流程变量的值得到之后有什么作用呢?
主要有两个作用:
- 就是可以当作流程判断的条件值,因为真的流出是少不了判断的,在这里我们只是用简单的来做演示而已;
- 就是可以供操作者来,参考决策,在于前端整合之后就可以以界面的形式将这些信息显示出来了;
以上就是流程变量的作用以及关于他的一些基本操作;
下篇博文将会为大家介绍,流程部署的第二种方式,以及流程线设置判断和网关的概念
敬请期待!!!!!