概念:

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

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

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

如果汇款和存档能够同一时候运行。那么主流程实例就包括了2个用来跟踪状态的子节点:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdjEyMzQxMTczOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

总的来说:

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);

JBPM学习(四):运行流程实例的更多相关文章

  1. JBPM学习(四):执行流程实例

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

  2. jBPM学习之部署流程定义

    也许部署流程定义的方法有很多,这里选用的是用Java代码调用工作流引擎提供的部署服务API.在这之前,假设你的Eclipse已经安装好了GPD工作流画图工具,并且学会了画出最简单的HelloWorld ...

  3. JBPM学习(五):流程变量

    1.启动流程实例 // 启动流程实例 @Test public void startProcessInstance() { // 使用指定key的最新版本的流程定义启动流程实例 ProcessInst ...

  4. 【CDN+】 Spark 的入门学习与运行流程

    前言 上文已经介绍了与Spark 息息相关的MapReduce计算模型,那么相对的Spark的优势在哪,有哪些适合大数据的生态呢? Spark对比MapReduce,Hive引擎,Storm流式计算引 ...

  5. TensorFlow学习之运行label_image实例

    前段时间,搞了搞编译label_image中cc的实例,最后终于搞定...但想在IDE中编译还没成功,继续摸索中. 现分享一下,探究过程,欢迎叨扰,交流. 个人地址:http://home.cnblo ...

  6. jBPM学习之利用API完成流程实例

    流程引擎对象ProcessEngine是jBPM4所有的Service API之源.在jBPM4中各种服务相互依存,但所有的Service API都从ProcessEngine中获得,由此可见Proc ...

  7. Activiti工作流学习(二)流程实例、执行对象、任务

    一.前言 前面说明了基本的流程部署.定义,启动流程实例等基本操作,下面我们继续来学习流程实例.执行对象.任务. 二.流程实例.执行对象说明 整个Activiti的生命周期经过了如下的几个步骤: 1.流 ...

  8. [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. 工作流学习——Activiti流程实例、任务管理四步曲 (zhuan)

    http://blog.csdn.net/zwk626542417/article/details/46646565 ***************************************** ...

随机推荐

  1. laravel开发之-安装汉化语言包

    第一种方法: 1.输入命令:composer require "overtrue/laravel-lang:dev-master" 2.将config/app.php中命令“Ill ...

  2. Java学习笔记(4)----Public,Protected,Package,Private修饰符可见性

    Java修饰符类型(public,protected,private,friendly) public的类.类属变量及方法,包内及包外的任何类均可以访问:protected的类.类属变量及方法,包内的 ...

  3. Hello,world的几种写法!

    这是我的第一篇文章!开个玩笑~~“你知道回字的四种写法吗”? printf("Hello,world!"); cout<<"Hello,world!" ...

  4. (C#) 多线程访问int, bool 等值类型变量

    参考: https://stackoverflow.com/questions/154551/volatile-vs-interlocked-vs-lock/154803

  5. 自定义View和ViewGroup(有这一篇就够了)

    为了扫除学习中的盲点,尽可能多的覆盖Android知识的边边角角,决定对自定义View做一个稍微全面一点的使用方法总结,在内容上面并没有什么独特的地方,其他大神们的博客上面基本上都有讲这方面的内容,如 ...

  6. Breakpoint debugging

    断点调试的作用: A:查看程序的执行流程. B:调试程序. package basic.java; public class DebugTest { public static void main(S ...

  7. web测试流程的总结及关注点

    项目的测试流程大只包含的几个阶段:立项.需求评审.用例评审.测试执行.测试报告文档 一.立项后测试需要拿到的文档 1.需求说明书 2.原型图(及UI图) 3.接口文档 4.数据库字典(表的数量.缓存机 ...

  8. oracle基础之游标的理解与使用

    关于游标,首先要知道游标的定义. 游标,是内存中的一款区域,用来存放select的结果集 游标用来处理从数据库中检索的多行记录(使用select语句).利用游标,程序可以逐个的处理和遍历一次索引返回的 ...

  9. postman trigger xdebug session in phpstorm

    phpstorm是一款非常棒的php开发调试工具,一般情况下我们使用firefox/chrome的bookmark,开启phpstorm debug侦听,随后点击start debugger, 我们就 ...

  10. ScriptManager的使用方法 .(转)

    从这一节开始我将和大家一起学习ASP.NET AJAX的服务器端控件的用法.首先,安装ASPAJAXExtSetup.msi,可以到微软官方网站上去下载.安装之后当你新建项目的时候会多出一个ASP.N ...