JBPM(五)执行流程实例

原创 2016年08月31日 09:37:46

概念:

ProcessInstance,流程实例:代表流程定义的一次执行.:张三昨天按请假流程请了一次假.一个流程实例包括了所有运行阶段,其中最典型的属性就是跟踪当前节点的指针,如下图。

 

Execution,执行:一般情况下,一个流程实例是一个执行树的根节点。 

使用树状结构的原因在于, 这一概念只有一条执行路径, 使用起来更简单。业务API不需要了解流程实例和执行之间功能的区别。因此,API里只有一个执行类型来引用流程实例和执行。

假设汇款和存档可以同时执行,那么主流程实例就包含了2个用来跟踪状态的子节点:

 

总的来说:

ProcessInstance(流程实例)就是Execution(执行对象),processInstanceId就是executionId。

 在源码中,ProcessInstance接口直接继承了Execution接口。

[java] view plain copy
  1. package org.jbpm.api;  
  2.   
  3.   
  4. /** a process instance is one execution of a process definition. 
  5.  * One process instance can have many concurrent executions.   
  6.  * Executions are structured in a tree of which the ProcessInstance  
  7.  * is the root. 
  8.  *  
  9.  * @author Tom Baeyens 
  10.  */  
  11. public interface ProcessInstance extends Execution {  
  12. }  

注释大概意思为:

一个流程实例是一个流程定义的执行。

一个流程实例可以有多个同时进行的执行对象。

执行对象构成了一棵树,而流程实例是这棵树的根结点。


1.启动流程实例

a) 普通方法

[java] view plain copy
  1. // 启动流程实例  
  2. // jbpm4_execution,正在执行的信息表  
  3. // jbpm4_hist_procinst,历史信息表  
  4. @Test  
  5. public void startProcessInstance() {  
  6.     // 使用指定key的最新版本的流程定义启动流程实例,返回一个实例流程对象  
  7.     ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");  
  8.   
  9.     System.out.println("id=" + pi.getId()//  
  10.             + ", state=" + pi.getState()//  
  11.             + ", processDefinitionId=" + pi.getProcessDefinitionId());  
  12. }  

b) 启动流程实例,并设置一些流程变量

[java] view plain copy
  1. Map<String, Object> variables = new HashMap<String, Object>();  
  2. variables.put("申请人""张三");  
  3. variables.put("报销金额"1000.00);  
  4.        
  5. // 启动流程实例,并设置一些流程变量  
  6. ProcessInstance pi = processEngine.getExecutionService()
  7.                             .startProcessInstanceByKey(processDefinitionKey, variables);  


2.向后执行一步(Signal

a) 向后执行一步,使用唯一的outcome离开活动

[java] view plain copy
  1. processEngine.getExecutionService().signalExecutionById(executionId);  

b) 向后执行一步,使用唯一的outcome离开活动,并设置一些流程变量

[java] view plain copy
  1. // 准备流程变量  
  2. Map<String, Object> variables = new HashMap<String, Object>();  
  3. variables.put("审批结果""同意");  
  4. processEngine.getExecutionService().signalExecutionById(executionId, variables);  


c) 向后执行一步,使用指定的outcome离开活动

[java] view plain copy
  1. String outcome= "to end1";  
  2. processEngine.getExecutionService().signalExecutionById(executionId, outcome);  

d) 向后执行一步,使用指定的outcome离开活动,并设置一些流程变量

[java] view plain copy
  1. String outcome= "to end1";  
  2. Map<String, Object> variables = new HashMap<String, Object>();  
  3. variables.put("审批结果""同意");  
  4. processEngine.getExecutionService().signalExecutionById(executionId, outcome, variables);  


3.查询任务

a) 查询个人任务列表

[java] view plain copy
  1. // 查询我的未办理完的任务列表  
  2. // jbpm4_task,正在执行的信息表  
  3. // jbpm4_hist_task,历史信息表  
  4. @Test  
  5. public void findMyTaskList() {  
  6.     String userId = "员工";  
  7.     //String userId = "部门经理";  
  8.     //String userId = "总经理";  
  9.   
  10.     // 方式1.查询我所有未办理的任务的列表  
  11.     // List<Task> list = processEngine.getTaskService().findPersonalTasks(userId);  
  12.     // 方式2.分页的查询  
  13.     List<Task> list = processEngine.getTaskService()//  
  14.                 .createTaskQuery()//  
  15.                 .assignee(userId)//  
  16.                 .page(0100)  
  17.                 .list();  
  18.   
  19.     // 显示  
  20.     System.out.println("============== 【" + userId + "】的未办理的任务列表 =============");  
  21.     for (Task t : list) {  
  22.         System.out.println("id=" + t.getId()//  
  23.                 + ", name=" + t.getName()// 任务的名称  
  24.                 + ", assignee=" + t.getAssignee()// 任务的办理人  
  25.                 + ", createTime=" + t.getCreateTime()// 任务的创建时间  
  26.                 + ", executionId=" + t.getExecutionId()); // 所属的执行对象的id  
  27.         }  
  28.     }  

b) 查询组任务列表

方式1

[java] view plain copy
  1. taskService.findGroupTasks(userId);  

方式2 

[java] view plain copy
  1. List<Task> list = processEngine.getTaskService()//  
  2.              .createTaskQuery()//  
  3.              .candidate(userId)//  
  4.              .list();  

4.办理任务

a) 正常完成任务

[java] view plain copy
  1. @Test  
  2. public void completeTask() {  
  3.     String taskId = "180009";  
  4.     //普通的方法  
  5.     processEngine.getTaskService().completeTask(taskId);  
  6.     //指定下一步的方法  
  7.     processEngine.getTaskService().completeTask(taskId, outcome);  
  8.     //设置流程变量的方法  
  9.     processEngine.getTaskService().completeTask(taskId, outcome, variables);  
  10. }  

b) 自行控制完成任务后是否向后流转(少用)

[java] view plain copy
  1. String taskId = "120001";  
  2. // 1,设置为false代表:办理完任务后不向后移动(默认为true)  
  3. TaskImpl taskImpl = (TaskImpl) processEngine.getTaskService().getTask(taskId);  
  4. taskImpl.setSignalling(false);  
  5. // 2,办理完任务  
  6. processEngine.getTaskService().completeTask(taskId);  

5.拾取任务(少用)

a) TaskService.takeTask(taskId, userId),拾取组任务到个人任务列表中,如果任务有assignee,则会抛异常。

b) processEngine.getTaskService().assignTask(taskId, userId),转交任务给其他人,(如果任务有assignee,则执行这个方法代表重新分配。也可以把assignee设为null表示组任务没有人办理了)

6.设置与获取流程变量

a) 方式1:根据 executionId 设置或获取流程变量

[java] view plain copy
  1. ExecutionService.setVariable(executionId, name, value);  
  2. Object obj = executionService.getVariable(executionId, "请假人");  

b) 方式2:根据 taskId 设置或获取流程变量

[java] view plain copy
  1. TaskService.setVariables(taskId, variables); // 一次设置多个变量  
  2. Object obj = executionService.getVariable(executionId, "请假人");  

7.直接结束流程实例(手工)

[java] view plain copy
  1. String processInstanceId =  "test.10001";  
  2. processEngine.getExecutionService()
  3.                 .endProcessInstance(processInstanceId, ProcessInstance.STATE_ENDED);  
版权声明:本文为博主原创文章,未经博主允许不得转载。

JBPM学习(一):实现一个简单的工作流例子全过程

最近发现这篇文章挺多人看的,也挺多人有疑问,我很想帮你们解答,但是很无奈,这篇文章只是我当时在自学时看的一个教程的记录,当时对JBPM也没有深入去学习,并且到现在也已经快4年了,这期间我都没用过JBP...
  • v123411739
  • v123411739
  • 2014年05月02日 17:32
  • 43878

jbpm入门例子

1.      jBPM的简单介绍jBPM是JBOSS下的一个开源java工作流项目,该项目提供eclipse插件,基于Hibernate实现数据持久化存储。   参考http://www.jboss...
  • hxirui
  • hxirui
  • 2006年09月14日 11:30
  • 136050

jBPM4工作流示例jbpmDemo

  • 2017年02月16日 20:06
  • 176.92MB
  • 下载

jbpm4.4_ssh_请假完整例子

Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8 整合例子(附完整的请假流程例子)。 1.       jbpm4.4 测试环境搭建 2.   ...
  • wwwwwwwwwwqaz
  • wwwwwwwwwwqaz
  • 2014年05月05日 17:20
  • 1512

JBPM 简单示例实现

一/准备工作: 1.引入JBPM相关JAR包  - 引入Hibernate依赖包  - 引入JBPM依赖包   * bsh.jar   * jcr-1.0.jar   * jbpm-ide...
  • linjingj
  • linjingj
  • 2013年01月08日 10:34
  • 1593

jbpm的一个实例

  • 2008年04月08日 22:31
  • 153KB
  • 下载

jbpm5第一个例子

  • 2013年01月02日 21:23
  • 6KB
  • 下载

jBPM4完整例子

  • 2012年12月09日 12:51
  • 21MB
  • 下载

JBPM6学习笔记(三)创建并运行Human Task

人工任务是工作流当中相当重要的一部分,现在
  • a4307515
  • a4307515
  • 2014年07月08日 11:15
  • 2540

JBPM4入门——8.等待节点的分支执行

本博文只是简要对JBPM4进行介绍,如需更详细内容请自行google链接: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门...
  • founder517518
  • founder517518
  • 2015年05月04日 10:11
  • 568
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JBPM(五)执行流程实例
举报原因:
原因补充:

(最多只允许输入30个字)