JBPM4工作流之流程变量的应用和动态指定工作流中某一个任务的办理者以及工作流的决策理解和实现
2014-09-24 19:37
656 查看
上一篇介绍了JBPM4工作流之在myecplsie中安装jBPM4.0开发插件以及JBPM4的简单介绍和入门
主要说明了JBPM4的搭建和初步的认识jbpm4工作流,这几天在学习jbpm4工作流框架中有不少的收获,一般在流程审批的oa项目中,,工作流框架是oa项目中经常应用到的,如何理解工作流整个的工作流程以及如何理解工作流中的任务和活动的区别,所以下面介绍一下jbpm4的流程变量和如何流程实例中任务的办理者,以及流程中决策的流转。
小知识:
任务:一般人为参与的称为任务。
活动:非人为参与的称为活动。
1、流程变量的junit单元测试实例:
根绝上一篇贴出的代码往下继续编写和介绍:
1.1、流程实例中的流程变量的定义:
1.2、流程实例中办理指定任务的流程变量的定义:
1.3、获取流程实例中的流程变量:
1.4:获取流程实例中任务的流程变量:
2、在OA项目中我们会发现,一个工作流程有多个任务或者活动,随着一个流程实例中的一个任务的完成会交给下个任务办理者办理。功能的实现:
2.1、某个任务对应某一个角色,比如说在某种特定的场景下:假设一间公司有几个项目组长,一般一个员工在某一个项目组,因此如果我们请假的话是交给项目组长审批,但是在jbpm4工作流中,我们都知道请假这个工作流是根据流程模板指定的,所以流程模板中的某一个任务通常指定的是某种角色,而不是指定的每一个人,因此下面会实现假设有一个请假工作流交给项目组长时,我们可以指定是哪一个项目组长(比如给小张或者大张审批)。
2.1.1、硬性指定流程实例中的任务办理者是谁:
流程定义图中的变量指定和上述的一样。
2.2.1、定义一个办理者处理器:
2.2.2:实现的代码:
3、在工作流中还会存在决策,任务的下一个流转走哪一条分支也取决决策中的判断,下面给出实例:
3.1、重新画出流程定义图:
3..2.2、代码实现:
决策处理器:
工作流中决策的实现:
最后贴出完整的代码:
·
主要说明了JBPM4的搭建和初步的认识jbpm4工作流,这几天在学习jbpm4工作流框架中有不少的收获,一般在流程审批的oa项目中,,工作流框架是oa项目中经常应用到的,如何理解工作流整个的工作流程以及如何理解工作流中的任务和活动的区别,所以下面介绍一下jbpm4的流程变量和如何流程实例中任务的办理者,以及流程中决策的流转。
小知识:
任务:一般人为参与的称为任务。
活动:非人为参与的称为活动。
1、流程变量的junit单元测试实例:
根绝上一篇贴出的代码往下继续编写和介绍:
1.1、流程实例中的流程变量的定义:
<span style="font-size:14px;">/** * 通过流程定义的key创建流程实例 */ @Test public void testCreateStartProcessInstanceByKey(){ //获取流程实例的服务对象 ExecutionService es=pe.getExecutionService(); //创建流程实例 ProcessInstance instance= es.startProcessInstanceByKey("test"); //定义流程定义上的变量 Map<String,Object> variables=new HashMap<String, Object>(); variables.put("initData", "员工试用期之间尽量少请假"); variables.put("initData_days", "请假天数至少不要超过5天"); es.setVariables(instance.getId(), variables); //通过key创建流程实例 System.out.println("流程实例的ID,不是DBID:"+instance.getId()); System.out.println("流程实例的key:"+instance.getKey()); System.out.println("流程实例的名字:"+instance.getName()); System.out.println("流程实例的状态:"+instance.getState()); }</span>
1.2、流程实例中办理指定任务的流程变量的定义:
<span style="font-size:14px;">/** * 根据任务ID办理指定的任务 */ @Test public void testCompleteTasks(){ //指定的任务ID String taskId="50002"; TaskService ts=pe.getTaskService(); //在任务中设置流程变量 Map<String,Object> variables=new HashMap<String, Object>(); variables.put("reason", "由于家里有事"); variables.put("days", "请假5天"); ts.setVariables(taskId, variables); //办理任务 ts.completeTask(taskId); }</span>
1.3、获取流程实例中的流程变量:
<span style="font-size:14px;">/** * 获取流程实例上的指定变量和所有变量 */ @Test public void testProcessDifinitionVariable(){ ExecutionService service=pe.getExecutionService(); /** * 1、获取指定的流程变量 */ //executionId:流程实例的id(不过我这里是通过key创建流程实例的,key的形式:name.id) String executionId="test.50001"; System.out.println( service.getVariable(executionId, "initData")); /** * 2、获取所有的流程实例中所有流程变量 */ Set<String> variableNames=service.getVariableNames(executionId); System.out.println("executionId指定的流程实例中的所有的流程变量:"+service.getVariables(executionId, variableNames)); }</span>
1.4:获取流程实例中任务的流程变量:
<span style="font-size:14px;">/** * 在任务中找到流程的指定变量和所有变量,和流程实例中找到流程变量具有相似性 */ @Test public void testFindTaskVariable(){ TaskService service= pe.getTaskService(); /** * 1、获取任务中指定的流程变量 */ //taskId:任务的id String taskId="70002"; System.out.println( service.getVariable(taskId, "reason")); System.out.println( service.getVariable(taskId, "days")); }</span>
2、在OA项目中我们会发现,一个工作流程有多个任务或者活动,随着一个流程实例中的一个任务的完成会交给下个任务办理者办理。功能的实现:
2.1、某个任务对应某一个角色,比如说在某种特定的场景下:假设一间公司有几个项目组长,一般一个员工在某一个项目组,因此如果我们请假的话是交给项目组长审批,但是在jbpm4工作流中,我们都知道请假这个工作流是根据流程模板指定的,所以流程模板中的某一个任务通常指定的是某种角色,而不是指定的每一个人,因此下面会实现假设有一个请假工作流交给项目组长时,我们可以指定是哪一个项目组长(比如给小张或者大张审批)。
2.1.1、硬性指定流程实例中的任务办理者是谁:
/** * 指定任务的下一个办理者(硬性指定的任务办理者是小张) */ @Test public void testAssigneeByUser(){ //指定的任务ID String taskId="250002"; TaskService ts=pe.getTaskService(); //在任务中设置流程变量 Map<String,Object> variables=new HashMap<String, Object>(); variables.put("reason", "由于家里有事"); variables.put("days", "请假三天"); variables.put("user", "小张"); //办理任务 ts.completeTask(taskId,"to 部门经理审批",variables); }2.2、通过请假的天数指定下一个任务办理者是谁:
流程定义图中的变量指定和上述的一样。
2.2.1、定义一个办理者处理器:
package jbpm4.demo1; import org.jbpm.api.model.OpenExecution; import org.jbpm.api.task.Assignable; import org.jbpm.api.task.AssignmentHandler; /** * 办理者处理器:(根据运算动态指定办理人),也就是说指定任务的下个办理者是谁,比如说部门经理:小张,大张 * @author Administrator * */ public class MyAssgineeHandler implements AssignmentHandler { @Override public void assign(Assignable assignable, OpenExecution execution) throws Exception { // TODO Auto-generated method stub //从流程实例中获取流程变量 int day= Integer.parseInt(execution.getVariable("day").toString()); if(day<5){ assignable.setAssignee("小张"); }else{ assignable.setAssignee("大张"); } } }
2.2.2:实现的代码:
/** * 指定任务的下一个办理者(通过请假的天数指定是由 部门经理:小张或者大张办理) */ @Test public void testAssigneeByDay(){ //指定的任务ID String taskId="280002"; TaskService ts=pe.getTaskService(); //在任务中设置流程变量 Map<String,Object> variables=new HashMap<String, Object>(); variables.put("reason", "由于家里有事"); variables.put("day", "5"); //办理任务 ts.completeTask(taskId,"to 部门经理审批",variables); }
3、在工作流中还会存在决策,任务的下一个流转走哪一条分支也取决决策中的判断,下面给出实例:
3.1、重新画出流程定义图:
3..2.2、代码实现:
决策处理器:
package jbpm4.demo2; import org.jbpm.api.jpdl.DecisionHandler; import org.jbpm.api.model.OpenExecution; /* * 决策处理器:指定任务的下一个跳转路径 */ public class MyDecision implements DecisionHandler { @Override public String decide(OpenExecution execution) { // TODO Auto-generated method stub int day= Integer.parseInt(execution.getVariable("day").toString()); if(day<5){ return "to end1";//到部门经理这里结束审批 }else{ return "to 总经理审批";//到总经理这里结束审批 } } }
工作流中决策的实现:
/** * 指定任务的下一个跳转路径:是直接到部门经理就已经审批结束or总经理审批结束 */ @Test public void testTaskByUser(){ //指定的任务ID String taskId="340002"; TaskService ts=pe.getTaskService(); //在任务中设置流程变量 Map<String,Object> variables=new HashMap<String, Object>(); variables.put("user", "小张"); variables.put("reason", "由于家里有事"); variables.put("day", "6"); //办理任务 ts.completeTask(taskId,"to 部门经理审批",variables); } /** * 指定任务的下一个跳转路径:是直接到部门经理就已经审批结束or总经理审批结束 */ @Test public void testTaskPathAssigneeByUser(){ //指定的任务ID String taskId="350004"; TaskService ts=pe.getTaskService(); //在办理任务时添加自己的流程变量 Map<String,Object> variables=new HashMap<String, Object>(); variables.put("user", "大张"); //办理任务 ts.completeTask(taskId,"to 决策",variables); }
最后贴出完整的代码:
package jbpm4.demo2;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.NewDeployment;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.task.Task;
import org.junit.Test;
public class HellowordDemo1 {
/**
* //建立jBPM4.4的数据库表
*/
@Test
public void testCreateJbpmTable(){
new org.hibernate.cfg.Configuration().configure("jbpm.hibernate.cfg.xml").buildSessionFactory();
}
//流程引擎,通过流程引擎获取各种服务接口
private ProcessEngine pe=Configuration.getProcessEngine();
/**
* 部署流程定义模板
*/
@Test
public void testDeployProcessDefinition(){
System.out.println(pe);
//获取流程定义的service对象
RepositoryService ps= pe.getRepositoryService();
//获取流程定义对象
NewDeployment deployment= ps.createDeployment();
//添加流程定义模板到流程定义对象中
deployment.addResourceFromClasspath("test.jpdl.xml").addResourceFromClasspath("test.png");
//流程定义模板的名称和时间
deployment.setName("请假流程模板");
deployment.setTimestamp(new Date().getTime());
//部署流程定义到数据库中
deployment.deploy();
}
/**
* 通过流程定义模板的ID创建流程实例
*/
@Test
public void testCreateStartProcessInstanceById(){
ExecutionService es= pe.getExecutionService();
ProcessInstance instance= es.startProcessInstanceById("test-2");
System.out.println("流程实例的ID:"+instance.getId());
System.out.println("流程实例的key:"+instance.getKey());
System.out.println("流程实例的名字:"+instance.getName());
System.out.println("流程实例的状态:"+instance.getState());
}
/**
* 通过流程定义的key创建流程实例
*/
@Test
public void testCreateStartProcessInstanceByKey(){
//获取流程实例的服务对象
ExecutionService es=pe.getExecutionService();
//创建流程实例
ProcessInstance instance= es.startProcessInstanceByKey("test");
//定义流程定义上的变量
Map<String,Object> variables=new HashMap<String, Object>();
variables.put("initData", "员工试用期之间尽量少请假");
variables.put("initData_days", "请假天数至少不要超过5天");
es.setVariables(instance.getId(), variables);
//通过key创建流程实例
System.out.println("流程实例的ID,不是DBID:"+instance.getId());
System.out.println("流程实例的key:"+instance.getKey());
System.out.println("流程实例的名字:"+instance.getName());
System.out.println("流程实例的状态:"+instance.getState());
}
/**
* 级联删除流程实例(不推荐)
* 实质:不是通过DBID,而是通过实例表的ID来删除
*/
public void testDeleteProcessInstance(){
ExecutionService es= pe.getExecutionService();
es.deleteProcessInstanceCascade("test.200001");
}
/**
* 查看用户未办理的任务
*/
@Test
public void testFindTasksById(){
String taskId="员工";
//获取任务的服务对象
TaskService ts=pe.getTaskService() ;
List<Task> tasks= ts.findPersonalTasks(taskId);
for(Task temp: tasks){
System.out.println("任务的DBID:"+temp.getId());
System.out.println("任务的名称:"+temp.getName());
System.out.println("任务的办理者:"+temp.getAssignee());
System.out.println("任务参照的流程实例:"+temp.getExecutionId());
System.out.println("任务参照的创建时间:"+temp.getCreateTime());
}
}
/**
* 根据任务ID办理指定的任务
*/
@Test
public void testCompleteTasks(){
//指定的任务ID
String taskId="50002";
TaskService ts=pe.getTaskService();
//在任务中设置流程变量
Map<String,Object> variables=new HashMap<String, Object>();
variables.put("reason", "由于家里有事");
variables.put("days", "请假5天");
ts.setVariables(taskId, variables);
//办理任务
ts.completeTask(taskId);
}
/**
* 获取流程实例上的指定变量和所有变量
*/
@Test
public void testProcessDifinitionVariable(){
ExecutionService service=pe.getExecutionService();
/**
* 1、获取指定的流程变量
*/
//executionId:流程实例的id(不过我这里是通过key创建流程实例的,key的形式:name.id)
String executionId="test.50001";
System.out.println( service.getVariable(executionId, "initData"));
/**
* 2、获取所有的流程实例中所有流程变量
*/
Set<String> variableNames=service.getVariableNames(executionId);
System.out.println("executionId指定的流程实例中的所有的流程变量:"+service.getVariables(executionId, variableNames));
}
/**
* 在任务中找到流程的指定变量和所有变量,和流程实例中找到流程变量具有相似性
*/
@Test
public void testFindTaskVariable(){
TaskService service= pe.getTaskService();
/**
* 1、获取任务中指定的流程变量
*/
//taskId:任务的id
String taskId="70002";
System.out.println( service.getVariable(taskId, "reason"));
System.out.println( service.getVariable(taskId, "days"));
}
/**
* 指定任务的下一个办理者(通过请假的天数指定是由 部门经理:小张或者大张办理)
*/
@Test
public void testAssigneeByUser(){
//指定的任务ID
String taskId="250002";
TaskService ts=pe.getTaskService();
//在任务中设置流程变量
Map<String,Object> variables=new HashMap<String, Object>();
variables.put("reason", "由于家里有事");
variables.put("user", "李四");
//办理任务
ts.completeTask(taskId,"to 部门经理审批",variables);
}
/** * 指定任务的下一个办理者(通过请假的天数指定是由 部门经理:小张或者大张办理) */ @Test public void testAssigneeByDay(){ //指定的任务ID String taskId="280002"; TaskService ts=pe.getTaskService(); //在任务中设置流程变量 Map<String,Object> variables=new HashMap<String, Object>(); variables.put("reason", "由于家里有事"); variables.put("day", "5"); //办理任务 ts.completeTask(taskId,"to 部门经理审批",variables); }
/** * 指定任务的下一个跳转路径:是直接到部门经理就已经审批结束or总经理审批结束 */ @Test public void testTaskByUser(){ //指定的任务ID String taskId="340002"; TaskService ts=pe.getTaskService(); //在任务中设置流程变量 Map<String,Object> variables=new HashMap<String, Object>(); variables.put("user", "小张"); variables.put("reason", "由于家里有事"); variables.put("day", "6"); //办理任务 ts.completeTask(taskId,"to 部门经理审批",variables); } /** * 指定任务的下一个跳转路径:是直接到部门经理就已经审批结束or总经理审批结束 */ @Test public void testTaskPathAssigneeByUser(){ //指定的任务ID String taskId="350004"; TaskService ts=pe.getTaskService(); //在办理任务时添加自己的流程变量 Map<String,Object> variables=new HashMap<String, Object>(); variables.put("user", "大张"); //办理任务 ts.completeTask(taskId,"to 决策",variables); }
}
·
相关文章推荐
- activiti 工作流动态设置指定节点任务人、责任人、组的实现方式
- activiti 工作流 动态 设置 指定 节点任务人、责任人、组 的实现方式
- 07-jbpm工作流之根据流程变量分配任务Task
- 转—gcc指定库路径,头文件路径以及实现静态动态链接
- 深入理解Lua的全局变量_G以及源码实现
- 深入理解Lua的全局变量_G以及源码实现
- 工作流Activiti5流程变量 任务变量 setVariables 和 setVariablesLocal区别
- Struts2为应用指定多个配置文件和动态方法调用以及通配符的使用方法
- 利用httpget实现计划任务访问某一指定页面
- 对java反射的理解,以及应用(实现简易ORM)。
- 深入理解Lua的全局变量_G以及源码实现
- Yii框架模型类的实现以及PHP5动态语言特性的应用
- 工作流的普通实现到jbpm4工作流的实现之一(普通请假单的流程实现)
- 工作流Activiti5流程变量 任务变量 setVariables 和 setVariablesLocal区别
- 工作流activiti-03数据查询(流程定义 流程实例 代办任务) 以及个人小练习
- JBPM具体应用之流程变量与任务变量
- 工作流Activiti5流程变量 任务变量 setVariables 跟 setVariablesLocal区别
- gcc指定库路径,头文件路径以及实现静态动态链接 .
- 【JBPM4】流程任务变量存取
- JAVAWEB开发之工作流详解(二)——Activiti核心API的使用(流程定义和流程实例的管理、流程变量、监听器...)以及与Spring的集成