jBPM学习之利用API完成流程实例
流程引擎对象ProcessEngine是jBPM4所有的Service API之源。在jBPM4中各种服务相互依存,但所有的Service API都从ProcessEngine中获得,由此可见ProcessEngine是jBPM4工作流API的核心。ProcessEngine是由Configuration类构建的,即工作流引擎根据配置产生。ProcessEngine是线程安全的,因此他可以保存在静态变量中。
因此,我们可以把获取ProcessEngine的代码编写如下:
package com.springchang.jbpm01;
import org.jbpm.api.Configuration;
import org.jbpm.api.ProcessEngine;
import org.junit.Test;
public class MyTest01 {
private static ProcessEngine processEngine; //直接将流程引擎写成静态变量
//静态代码块,获取processEngine
static {
Configuration cfg = new Configuration();
cfg.setResource("jbpm.cfg.xml");
processEngine = cfg.buildProcessEngine();
}
// 1,部署流程定义文档
@Test
public void testDeployProcessDefinition() throws Exception {
String deploymentId = processEngine.getRepositoryService() //调用processEngine提供的接口
.createDeployment()
.addResourceFromClasspath("com/springchang/jbpm01/HelloWorld.jpdl.xml") //加载HelloWorld.jpdl.xml文件
.addResourceFromClasspath("com/springchang/jbpm01/HelloWorld.png") //加载Helloworld.png图片
.deploy(); //发布流程定义
System.out.println(deploymentId);
}
}
而本节的重点是调用jBPM4.4中给定的各种API,从流程的发起,部署,办理任务到历史任务查询等一系列的操作。首先,流程定义如图所示:

对应的jPDL:
<?xml version="1.0" encoding="UTF-8"?>
<process name="process" xmlns="http://jbpm.org/4.4/jpdl">
<start g="118,16,48,48" name="start1">
<transition g="-66,-22" name="to state1" to="state1"/>
</start>
<!-- state活动是等待活动,需要收到一个外部的执行信号才能流转通过 -->
<state g="96,96,92,52" name="state1">
<transition g="-60,-22" name="to task1" to="task1"/>
</state>
<!-- task活动是等待活动,在这里被分配给用户Spring Chang办理,Spring Chang办理完成提交任务后才能流转通过 -->
<task assignee="Spring Chang" g="96,180,92,52" name="task1">
<transition g="-57,-22" name="to end1" to="end1"/>
</task>
<end g="118,264,48,48" name="end1"/>
</process>
使用jBPM Service API发起并完成上面名为process的流程定义。代码如下:
package com.springchang.jbpm01;
import static org.junit.Assert.*;
import org.jbpm.api.Configuration;
import org.jbpm.api.Execution;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.history.HistoryProcessInstance;
import org.jbpm.api.history.HistoryTask;
import org.jbpm.api.task.Task;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class ProcessTest {
private ProcessEngine processEngine;
private String deploymentId;
@Before
public void setUp() throws Exception {
processEngine = Configuration.getProcessEngine();
deploymentId = processEngine.getRepositoryService().createDeployment()
.addResourceFromClasspath("com/springchang/jbpm01/process.jpdl.xml")
.addResourceFromClasspath("com/springchang/jbpm01/process.png")
.deploy();
}
@After
public void tearDown() throws Exception {
processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);
}
@Test
public void test() {
//使用执行任务,根据已经部署的名陈process,发起流程实例
ProcessInstance processInstance = processEngine.getExecutionService().startProcessInstanceByKey("process");
//获取流程实例id
String pid = processInstance.getId();
System.out.println("pid:" + pid);
//获取当前活动的执行对象
Execution executionInState = processInstance.findActiveExecutionIn("state1");
//断言当前活动是state1
assertNotNull(executionInState);
//使用执行服务:发出执行信号结束当前活动,继续流程的执行
String executionId = executionInState.getId();
System.out.println("executionId:" + executionId);
processEngine.getExecutionService().signalExecutionById(executionId);
//使用执行服务:从持久化层中获取“最新”的流程实例对象
processInstance = processEngine.getExecutionService().findProcessInstanceById(pid);
//获取当前活动的执行对象
Execution executionInTask = processInstance.findActiveExecutionIn("task1");
//断言当前活动即为task
assertNotNull(executionInTask);
//使用任务服务:获取用户Spring Chang的任务,即task活动产生的任务
Task task = processEngine.getTaskService().findPersonalTasks("Spring Chang").get(0);
assertEquals("Spring Chang", task.getAssignee());
//使用任务服务,完成任务
processEngine.getTaskService().completeTask(task.getId());
//使用历史服务:创建历史任务查询
HistoryTask historyTask = processEngine.getHistoryService().createHistoryTaskQuery()
.taskId(task.getId()).uniqueResult();
//断言上一步完成的任务已经成为历史,即可通过历史任务查询获取到它
assertNotNull(historyTask);
//断言该流程已经结束
//assertProcessInstanceEnded(pid);
//使用历史服务:创建历史流程实例查询
HistoryProcessInstance historyProcessInst = processEngine.getHistoryService()
.createHistoryProcessInstanceQuery()
.processInstanceId(pid)
.uniqueResult();
//断言该流程已经成为历史,即可通过历史流程实例查询获取它
assertNotNull(historyProcessInst);
}
}
上诉单元测试的代码setUp方法是部署流程定义,并调用addResourceFromClasspath方法加载流程实例文档来部署流程定义。tearDown方法作用是删除刚才部署的流程定义,并将与其相关的关联表的内容一并清空,主要的代码放在test测试方法里面。
jBPM学习之利用API完成流程实例的更多相关文章
- JBPM工作流(五)——执行流程实例
概念: ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包括了所有运行阶段,其中最典型的属性就是跟踪当前节点的指针,如下图. Execu ...
- 工作流学习——Activiti流程实例、任务管理四步曲 (zhuan)
http://blog.csdn.net/zwk626542417/article/details/46646565 ***************************************** ...
- JBPM学习(四):执行流程实例
概念: ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包括了所有运行阶段,其中最典型的属性就是跟踪当前节点的指针,如下图. Execu ...
- JBPM学习(四):运行流程实例
概念: ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包含了全部执行阶段,当中最典型的属性就是跟踪当前节点的指针,例如以下图. Exe ...
- JBPM学习(二):ProcessEngine与Service API
1.获取processEngine的方法: a) 方法一 private ProcessEngine processEngine = new Configuration().setResource(& ...
- jBPM学习之部署流程定义
也许部署流程定义的方法有很多,这里选用的是用Java代码调用工作流引擎提供的部署服务API.在这之前,假设你的Eclipse已经安装好了GPD工作流画图工具,并且学会了画出最简单的HelloWorld ...
- Activiti工作流学习(二)流程实例、执行对象、任务
一.前言 前面说明了基本的流程部署.定义,启动流程实例等基本操作,下面我们继续来学习流程实例.执行对象.任务. 二.流程实例.执行对象说明 整个Activiti的生命周期经过了如下的几个步骤: 1.流 ...
- JBPM流程实例(PI)Process Instance
/** * 流程实例 * * 启动流程实例 * * 完成任务 * * 查询 * * 查询流程实例 * * 查询任务 * * 查询正在 ...
- JBPM学习(五):流程变量
1.启动流程实例 // 启动流程实例 @Test public void startProcessInstance() { // 使用指定key的最新版本的流程定义启动流程实例 ProcessInst ...
随机推荐
- 我的csdn博客搬家了
把csdn上的文章都给搬到我的新博客去了, 将会在新的博客上继续写相关的技术文章 欢迎訪问: http://www.kai-zhou.com
- Apache HTTPserver安装后报:无法启动,由于应用程序的并行配置不对-(已解决)
原创作品.出自 "深蓝的blog" 博客.欢迎转载,转载时请务必注明出处.否则有权追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...
- Cocos2d-x 3.0正式版及android环境搭建
开发环境是:mac + xcode + eclipse ,在win以下的环境和这个都是一样的,唯一不一样的就是环境变量的配置. 以下主要介绍cocos2d-x环境的设置以及android的环境搭建 1 ...
- 在Docker中运行asp.net core 跨平台应用程序
概述 Docker已经热了有一两年了,而且我相信这不是一个昙花一现的技术,而是一个将深远影响我们日后开发和部署.运营应用系统的一种创新(很多人将其作为devops的一种非常重要的基石).学习docke ...
- Django的Form(二)
上一篇已经简单介绍了Django的Form,现在开始进阶操作了 ..... 创建Form类的时候,主要涉及到Form字段和Form的插件,字段用于做form验证,插件用来生成HTML DjiangoF ...
- CSS小全
CSS 的使用 内联(inline style attribute) 完全不应该这样做 <head> 标签内的 <style> 标签 偶尔可以用 <link> 标签 ...
- 如何在Intellij IDEA中拉svn分支?
由于用IDEA时间也不是特别长,对操作svn的一些东西,不是特别熟悉,特此记录一下,以做备忘. 先说下流程: 在IDEA里面对trunk代码拉分支熟悉了,其实很容易, (1)你trunk目录下的得有个 ...
- python串口调试,M3650B-HA调试
使用python serial与M3650B-HA(RFID读写器)串口通信 环境:py3.6 模块:pyserial 1.serial模块安装2.废话不多说,直接上代码,测试环境py3.6 # co ...
- OC学习11——循环引用与@class
转载自 OC学习篇之---@class关键字的作用以及#include和#import的区别 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#in ...
- xCode8以及iOS10 的新特性
其他:ios10中 适配问题(1.系统判断方法失效:2.隐私数据的访问问题:3.UIColor 问题4.真彩色的显示5.ATS问题6.UIStatusBar问题7.UITextField8.UserN ...