JBPM学习(3):管理流程实例
来源:互联网 发布:非主流伤感的网络歌曲 编辑:程序博客网 时间:2024/05/18 03:45
流程定义就是对一个过程的完整描述,如果说流程定义是一个模板,那么流程实例就是实际执行的业务(个人觉得有一点点像JAVA中的类和实例),根据流程定义从前往后依次执行。
这一节,在上一节管理流程定义的基础上,学习以下几种管理流程实例的方法。
- 启动流程实例
- 执行等待的流程
- 查看流程实例
- 终止流程实例
- 删除流程实例
这是在第一节定义的流程,本节继续使用该流程进行学习。
管理流程实例的所有测试代码如下,下面分别就每一种管理方法进行说明。
package com.test;import java.util.List;import org.jbpm.api.Configuration;import org.jbpm.api.ExecutionService;import org.jbpm.api.ProcessEngine;import org.jbpm.api.ProcessInstance;import org.jbpm.api.RepositoryService;import junit.framework.TestCase;public class ProcessInstanceTest extends TestCase {// 流程引擎 ,所有操作都是从它开始的ProcessEngine processEngine;public ProcessInstanceTest() {processEngine = Configuration.getProcessEngine();}protected void setUp() {// 流程资源服务的接口,如流程定义发布、查询、删除等RepositoryService repositoryService = processEngine.getRepositoryService();//发布流程定义repositoryService.createDeployment().addResourceFromClasspath("HelloJbpm.jpdl.xml").deploy();}// 发布流程定义之后,测试流程定义的启动public void testProcessInstance() {// 专门用来控制流程实例ExecutionService executionService = processEngine.getExecutionService();// 通过key找到已发布的流程定义,从而启动该流程定义的流程实例ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");System.out.println(pi); // 打印流程实例查看状态System.out.println(pi.isEnded()); // 判断流程实例是否结束了(没有结束,卡在state处)pi=executionService.signalExecutionById(pi.getId()); //将pi所对应的流程实例继续向下执行System.out.println(pi.isEnded()); // 此时判断流程已结束}public void testProcessInstanceEnd() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");//-------------------此时不想让其继续向下执行----------------------executionService.endProcessInstance(pi.getId(),"cancel");//参数2为强制终结流程的理由}//直接删除流程实例public void testProcessInstanceDelete() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");//级联删除流程实例executionService.deleteProcessInstanceCascade(pi.getId());}//获得流程引擎中所有流程实例的信息public void testProcessInstanceList() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");ProcessInstance pi1 = executionService.startProcessInstanceByKey("HelloJbpm");List<ProcessInstance> list=executionService.createProcessInstanceQuery().list();for(ProcessInstance processInstance:list){System.out.println(processInstance.getId()); //直接打印所有流程定义的信息}}}1、启动流程实例
如上代码所示,在发布流程定义之后,使用testProcessInstance()方法测试流程实例的启动,该代码片段如下:
public void testProcessInstance() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");System.out.println(pi); // 打印流程实例查看状态System.out.println(pi.isEnded()); // 判断流程实例是否结束了(没有结束,卡在state处)}执行结果:
execution[HelloJbpm.7]表明启动的是HelloJbpm流程定义的一个实例。
false表明实际上该流程实例并没有直接结束。
如流程定义图所示,因为中间使用了一个state活动,所以流程实例会在state活动暂停下来,进入到等待状态。
当一个流程执行到等待状态时,需要调用一个方法。执行等待的流程,下面为执行等待流程的方法。
2、执行等待流程
在启动流程实例的基础上,当流程执行到等待状态时,使用signalExecutionById()执行等待流程,让流程实例继续往下执行,代码片段如下:
public void testProcessInstance() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");System.out.println(pi); // 打印流程实例查看状态System.out.println(pi.isEnded()); // 判断流程实例是否结束了(没有结束,卡在state处)pi=executionService.signalExecutionById(pi.getId()); //将pi所对应的流程实例继续向下执行System.out.println(pi.isEnded()); // 此时判断流程已结束}执行结果:
通过手工调用的方法,继续执行流程实例,至流程结束。
以上两步整体描述为:
首先启动一个流程实例,从开始节点进入state活动,在state活动时进入等待状态,直到手工执行一个
pi=executionService.signalExecutionById(pi.getId())方法,流程继续执行,直至end节点,完成整个流程实例。
3、查看流程实例
通过此方法,可以看到所有启动的流程实例信息,代码片段如下:
public void testProcessInstanceList() {ExecutionService executionService = processEngine.getExecutionService();//启动两个流程实例ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");ProcessInstance pi1 = executionService.startProcessInstanceByKey("HelloJbpm");List<ProcessInstance> list=executionService.createProcessInstanceQuery().list();for(ProcessInstance processInstance:list){System.out.println(processInstance.getId()); //直接打印所有流程实例的信息}}控制台打印出两条已启动的流程实例
4、终止流程实例
如果不想按照流程执行,也可以手工将其强制终止或删除,方法如下:
public void testProcessInstanceEnd() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");//-------------------此时不想让其继续向下执行----------------------executionService.endProcessInstance(pi.getId(),"cancel");//参数2为强制终结流程的理由}5、删除流程实例
与终止流程实例的功能类似
public void testProcessInstanceDelete() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");//级联删除流程实例executionService.deleteProcessInstanceCascade(pi.getId());}至此,就总结完了管理流程实例的几种方法。
备注:每次启动一个业务实际上都是发起一个新流程,业务终止时也就是流程结束时。
- JBPM学习(3):管理流程实例
- jbpm学习笔记(三)--管理流程实例
- Jbpm流程管理实例(一)
- Jbpm流程管理实例(二)
- JBPM学习(2):管理流程定义
- OA总结—jbpm管理流程实例
- JBPM学习(四):执行流程实例
- JBPM学习(四):执行流程实例
- JBPM学习(三):管理流程定义
- JBPM学习(三):管理流程定义
- JBPM流程实例(PI)Process Instance
- JBPM流程实例(PV)Process Variables
- JBPM(五)执行流程实例
- 工作流--JBPM流程管理
- (3)jBPM websale代码学习: home.jsp(启动流程)
- (3)jBPM websale代码学习: home.jsp(启动流程)
- (3)jBPM websale代码学习: home.jsp(启动流程)
- JBPM学习(四)--一个实例和查看流程进度图片(涉及中文乱码)
- tomcat下url映射
- [Java] Java泛型问题 关于警告:XXis a raw type
- C#(.Net)平台下生成随机数方法的小结
- IOS成长之路-推送(本地推送)
- 梁友栋-Barsky裁剪算法
- JBPM学习(3):管理流程实例
- python对中文路径/文件名的重命名
- Zen Coding css,html缩写替换大观 快速写出html,css
- javascript技巧-javascript深入理解js闭包
- android4.1 activity内屏蔽HOME按键功能
- 抽象的操作系统(十) --- 中间件(完)
- C语言字符串转换成日期
- ActionBarSherlock
- 自动识别文件编码