JBPM学习(四):运行流程实例
2016-04-05 08:53
676 查看
概念:
ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包含了全部执行阶段,当中最典型的属性就是跟踪当前节点的指针,例如以下图。
Execution,运行:普通情况下,一个流程实例是一个运行树的根节点。
使用树状结构的原因在于, 这一概念仅仅有一条运行路径, 使用起来更简单。业务API不须要了解流程实例和运行之间功能的差别。因此,API里仅仅有一个运行类型来引用流程实例和运行。
如果汇款和存档能够同一时候运行。那么主流程实例就包括了2个用来跟踪状态的子节点:
总的来说:
ProcessInstance(流程实例)就是Execution(运行对象),processInstanceId就是executionId。
在源代码中。ProcessInstance接口直接继承了Execution接口。
凝视大概意思为:
一个流程实例是一个流程定义的运行。
一个流程实例能够有多个同一时候进行的运行对象。
运行对象构成了一棵树,而流程实例是这棵树的根结点。
1.启动流程实例
a) 普通方法
b) 启动流程实例,并设置一些流程变量
2.向后运行一步(Signal)
a) 向后运行一步。使用唯一的outcome离开活动
b) 向后运行一步,使用唯一的outcome离开活动,并设置一些流程变量
c) 向后运行一步。使用指定的outcome离开活动
d) 向后运行一步,使用指定的outcome离开活动,并设置一些流程变量
3.查询任务
a) 查询个人任务列表
b) 查询组任务列表
方式1:
方式2:
4.办理任务
a) 正常完毕任务
b) 自行控制完毕任务后是否向后流转(少用)
5.拾取任务(少用)
a) TaskService.takeTask(taskId, userId),拾取组任务到个人任务列表中。假设任务有assignee,则会抛异常。
b) processEngine.getTaskService().assignTask(taskId, userId),转交任务给其它人,(假设任务有assignee,则运行这种方法代表又一次分配。也能够把assignee设为null表示组任务没有人办理了)
6.设置与获取流程变量
a) 方式1:依据 executionId 设置或获取流程变量
b) 方式2:依据 taskId 设置或获取流程变量
7.直接结束流程实例(手工)
ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包含了全部执行阶段,当中最典型的属性就是跟踪当前节点的指针,例如以下图。
Execution,运行:普通情况下,一个流程实例是一个运行树的根节点。
使用树状结构的原因在于, 这一概念仅仅有一条运行路径, 使用起来更简单。业务API不须要了解流程实例和运行之间功能的差别。因此,API里仅仅有一个运行类型来引用流程实例和运行。
如果汇款和存档能够同一时候运行。那么主流程实例就包括了2个用来跟踪状态的子节点:
总的来说:
ProcessInstance(流程实例)就是Execution(运行对象),processInstanceId就是executionId。
在源代码中。ProcessInstance接口直接继承了Execution接口。
package org.jbpm.api; /** a process instance is one execution of a process definition. * One process instance can have many concurrent executions. * Executions are structured in a tree of which the ProcessInstance * is the root. * * @author Tom Baeyens */ public interface ProcessInstance extends Execution { }
凝视大概意思为:
一个流程实例是一个流程定义的运行。
一个流程实例能够有多个同一时候进行的运行对象。
运行对象构成了一棵树,而流程实例是这棵树的根结点。
1.启动流程实例
a) 普通方法
// 启动流程实例 // jbpm4_execution,正在运行的信息表 // jbpm4_hist_procinst,历史信息表 @Test public void startProcessInstance() { // 使用指定key的最新版本号的流程定义启动流程实例,返回一个实例流程对象 ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test"); System.out.println("id=" + pi.getId()// + ", state=" + pi.getState()// + ", processDefinitionId=" + pi.getProcessDefinitionId()); }
b) 启动流程实例,并设置一些流程变量
Map<String, Object> variables = new HashMap<String, Object>(); variables.put("申请人", "张三"); variables.put("报销金额", 1000.00); // 启动流程实例,并设置一些流程变量 ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey(processDefinitionKey, variables);
2.向后运行一步(Signal)
a) 向后运行一步。使用唯一的outcome离开活动
processEngine.getExecutionService().signalExecutionById(executionId);
b) 向后运行一步,使用唯一的outcome离开活动,并设置一些流程变量
// 准备流程变量 Map<String, Object> variables = new HashMap<String, Object>(); variables.put("审批结果", "允许"); processEngine.getExecutionService().signalExecutionById(executionId, variables);
c) 向后运行一步。使用指定的outcome离开活动
String outcome= "to end1"; processEngine.getExecutionService().signalExecutionById(executionId, outcome);
d) 向后运行一步,使用指定的outcome离开活动,并设置一些流程变量
String outcome= "to end1"; Map<String, Object> variables = new HashMap<String, Object>(); variables.put("审批结果", "允许"); processEngine.getExecutionService().signalExecutionById(executionId, outcome, variables);
3.查询任务
a) 查询个人任务列表
// 查询我的未办理完的任务列表 // jbpm4_task,正在运行的信息表 // jbpm4_hist_task,历史信息表 @Test public void findMyTaskList() { String userId = "员工"; //String userId = "部门经理"; //String userId = "总经理"; // 方式1.查询我全部未办理的任务的列表 // List<Task> list = processEngine.getTaskService().findPersonalTasks(userId); // 方式2.分页的查询 List<Task> list = processEngine.getTaskService()// .createTaskQuery()// .assignee(userId)// .page(0, 100) .list(); // 显示 System.out.println("============== 【" + userId + "】的未办理的任务列表 ============="); for (Task t : list) { System.out.println("id=" + t.getId()// + ", name=" + t.getName()// 任务的名称 + ", assignee=" + t.getAssignee()// 任务的办理人 + ", createTime=" + t.getCreateTime()// 任务的创建时间 + ", executionId=" + t.getExecutionId()); // 所属的运行对象的id } }
b) 查询组任务列表
方式1:
taskService.findGroupTasks(userId);
方式2:
List<Task> list = processEngine.getTaskService()// .createTaskQuery()// .candidate(userId)// .list();
4.办理任务
a) 正常完毕任务
@Test public void completeTask() { String taskId = "180009"; //普通的方法 processEngine.getTaskService().completeTask(taskId); //指定下一步的方法 processEngine.getTaskService().completeTask(taskId, outcome); //设置流程变量的方法 processEngine.getTaskService().completeTask(taskId, outcome, variables); }
b) 自行控制完毕任务后是否向后流转(少用)
String taskId = "120001"; // 1,设置为false代表:办理完任务后不向后移动(默觉得true) TaskImpl taskImpl = (TaskImpl) processEngine.getTaskService().getTask(taskId); taskImpl.setSignalling(false); // 2,办理完任务 processEngine.getTaskService().completeTask(taskId);
5.拾取任务(少用)
a) TaskService.takeTask(taskId, userId),拾取组任务到个人任务列表中。假设任务有assignee,则会抛异常。
b) processEngine.getTaskService().assignTask(taskId, userId),转交任务给其它人,(假设任务有assignee,则运行这种方法代表又一次分配。也能够把assignee设为null表示组任务没有人办理了)
6.设置与获取流程变量
a) 方式1:依据 executionId 设置或获取流程变量
ExecutionService.setVariable(executionId, name, value); Object obj = executionService.getVariable(executionId, "请假人");
b) 方式2:依据 taskId 设置或获取流程变量
TaskService.setVariables(taskId, variables); // 一次设置多个变量 Object obj = executionService.getVariable(executionId, "请假人");
7.直接结束流程实例(手工)
String processInstanceId = "test.10001"; processEngine.getExecutionService().endProcessInstance(processInstanceId, ProcessInstance.STATE_ENDED);
相关文章推荐
- 微信团队里有一枚老外产品经理,这是他观察到的中国互联网趣事
- 产品经理职责
- 使用IPMI工具实现对服务器的远程管理
- USE [EPPM] [dbo].[REFRDEL_CLEANUP]
- 《产品经理的二十堂课》—— 读后总结
- 拉勾沙龙会上,前大众点评产品经理运满满CTO分享的程序员职业规划
- 【图像处理】【SEED-VPM】7.RBL, UBL, Uboot的关系
- 国内首部基于JBPM5.4实战流程引擎开发(动态表单、模板引擎、公文管理系统)
- Chrome development tools 笔记
- rpm包的依赖关系如何通过yum解决
- 第6章招聘产品经理——寻找出色的产品经理
- 谷歌DeepMind现在可以分析万智牌和炉石卡
- Can't locate ExtUtils/Embed.pm in @INC (@INC contains: /usr/local/lib64/perl5
- 手游产品经理初探(六)粗糙的logo会给产品致命一击
- 产品经理必知
- APMserv 5.2.6 安装教程
- RK3288开发板PopMetal上的GPIO驱动实例
- pmpi简单实例
- 产品经理职业分享以及求职技巧讲座
- (OK) cBPM(段错误(吐核))—((EndWorkflowEvent*)evt)->getProcessID()—getenv 返NULL