概念:

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

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

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

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

总的来说:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
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) 普通方法

1
2
3
4
5
6
7
8
9
10
11
12
// 启动流程实例
    // 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) 启动流程实例,并设置一些流程变量

1
2
3
4
5
6
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离开活动

1
processEngine.getExecutionService().signalExecutionById(executionId);

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

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

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

1
2
String outcome= "to end1";
    processEngine.getExecutionService().signalExecutionById(executionId, outcome);

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

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

  

3.查询任务

a) 查询个人任务列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 查询我的未办理完的任务列表
    // 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:

1
taskService.findGroupTasks(userId);

  方式2:

1
2
3
4
List<Task> list = processEngine.getTaskService()// 
             .createTaskQuery()// 
             .candidate(userId)// 
             .list(); 

  

4.办理任务

a) 正常完成任务

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

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

1
2
3
4
5
6
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 设置或获取流程变量

1
2
ExecutionService.setVariable(executionId, name, value);
    Object obj = executionService.getVariable(executionId, "请假人");

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

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

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

1
2
String processInstanceId =  "test.10001";
    processEngine.getExecutionService().endProcessInstance(processInstanceId, ProcessInstance.STATE_ENDED);

JBPM工作流(五)——执行流程实例的更多相关文章

  1. JBPM4.4_执行流程实例

    1. 执行流程实例 1.1. 启动流程实例 说明:流程实例创建后,直接就到开始活动后的第一个活动,不会在开始活动停留. 1.1.1. 示例代码1:使用指定key的最新版本的流程定义启动流程实例 Pro ...

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

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

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

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

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

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

  5. JBPM4入门——6.流程实例的创建和执行

    本博文只是简要对JBPM4进行介绍,如需更详细内容请自行google 链接: JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流 ...

  6. Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】

    上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]- 管理流程定义 管理流程定义主要涉及到以下的4张表: -- 流程部署相关的表 SEL ...

  7. 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】

    OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...

  8. 工作流JBPM_day01:3-使用JBPM的API添加与执行流程

    工作流JBPM_day01:3-使用JBPM的API添加与执行流程 流程定义画完得到压缩文件--->部署流程定义-->启动流程实例-->查询我的个人任务列表-->办理任务--& ...

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

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

随机推荐

  1. 阿里云ACE深圳同城会 开始报名

    大家好,阿里云 ACE深圳同城会本周末第一活动,主要大家一起聚聚,互相认识和熟悉,未来一起玩儿一起进步~ 通知大家一个好消息,当前凡是加入深圳ACE同城会组织(群)的朋友,通过跟群主报名申请,将有机会 ...

  2. Spark2.2(三十九):如何根据appName监控spark任务,当任务不存在则启动(任务存在当超过多久没有活动状态则kill,等待下次启动)

    业务需求 实现一个根据spark任务的appName来监控任务是否存在,及任务是否卡死的监控. 1)给定一个appName,根据appName从yarn application -list中验证任务是 ...

  3. Sandcastle Help File Builder(.NET帮助文档工具)的版本选择心得——支持VS2010至VS2015,高版本项目文件问题

    作者: zyl910 一.缘由 "Sandcastle Help File Builder"(简称SHFB)是一个很好用.NET 帮助文档生成工具. 但它的每个版本支持的VS版本范 ...

  4. web安全测试---AppScan扫描工具

    安全测试应该是测试中非常重要的一部分,但他常常最容易被忽视掉. 尽管国内经常出现各种安全事件,但没有真正的引起人们的注意.不管是开发还是测试都不太关注产品的安全.当然,这也不能怪我们苦B的“民工兄 弟 ...

  5. Oracle&SQLServer中实现跨库查询

    一.在SQLServer中连接另一个SQLServer库数据 在SQL中,要想在本地库中查询另一个数据库中的数据表时,可以创建一个链接服务器: EXEC master.dbo.sp_addlinked ...

  6. 【解惑】领略Java内部类的“内部”

    转自:http://www.iteye.com/topic/494230 内部类有两种情况: (1) 在类中定义一个类(私有内部类,静态内部类) (2) 在方法中定义一个类(局部内部类,匿名内部类) ...

  7. 基于Vue element-ui实现支持多级纵向动态表头的仿表格布局

    [本文出自天外归云的博客园] 需求图示如下,多级纵向动态表头表格: 我的思路是用element-ui的layout实现,做出一个仿造表格,能够支持动态的.多级的.纵向的表头: <template ...

  8. LaTeX数学模式&上下标&代码块

    效果就是如上图所示了.学习了使用数学模式插入公式和使用上标和公式的编号.这里的目录没有展开,在编译一次目录会展开,代码块会被挤到下一页上面去. \documentclass[UTF8]{ctexart ...

  9. 【宣讲】德州科技职业学院宣讲关于IT领域趋势分析

    12月25日,AICODER马伦老师受德州科技职业学院校领导的邀请,到德州科技职业学院青岛校区洽谈新型的校区合作,创新现有的职业教育的传统模式的束缚,探索新型的职业教育直接跟企业实习实战结合的新型职业 ...

  10. 导出表结构到Excel 生成代码用

    导出表结构到Excel ,统一维护,生成代码用 SELECT C.TABLE_NAME,CC.COMMENTS,C.COLUMN_NAME,C.DATA_TYPE, CASE WHEN C.DATA_ ...