- 浏览: 34259 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
namezhou:
如果你有20个应用,用户进入桌面后,可能只使用两三个而已,但是 ...
实现单点登录的思路 -
accommands:
非常的系统。。。
jbpm资料 -
lantian_123:
非常好的入门资料 ,顺便问下楼主你看的jpa资料是什么?
JPA学习笔记
流程定义引擎:
ProcessEngine processEngine;
获取:
processEngine=Configuration.getProcessEngine(); |
重要的几个接口:
RepositoryService repositoryService; ExecutionService executionService; TaskService taskService; HistoryService historyService; ManagementService managementService; |
获取:
repositoryService=processEngine.getRepositoryService(); executionService=processEngine.getExecutionService(); taskService=processEngine.getTaskService(); historyService=processEngine.getHistoryService(); managementService=processEngine.getManagementService(); |
说明:
RepositoryService主要用来管理和发布流程定义,发布流程定义、删除流程定义、查看流程定义。
流程定义发布:
repositoryService.createDeployment().addResourceFromClasspath("demo.jpdl.xml").deploy(); |
注:此方法表示从classpath路径加载一个流程定义文件,并发布,上例中demo.jpdl.xml文件位于src(classpath)路径下,若流程定义文件放置与包中,则需要使用包名+jpdl文件名。如com/jbpm/demo.jpdl.xml
查看流程定义:
repositoryService.createDeployment().addResourceFromClasspath("test1.jpdl.xml").deploy(); List<ProcessDefinition> list=repositoryService.createProcessDefinitionQuery().list(); for (ProcessDefinition processDefinition : list) { System.out.println("流程定义Id:"+processDefinition.getId()); System.out.println("流程部署Id:"+processDefinition.getDeploymentId()); } |
删除流程定义:
String deploymentId=repositoryService.createDeployment().addResourceFromClasspath("test1.jpdl.xml").deploy(); repositoryService.deleteDeploymentCascade(deploymentId); |
deploymentId为流程定义部署Id
ExecutionService主要用来操作流程实例,启动流程实例、查看流程实例、删除流程实例、结束流程实例。
其前提条件是发布了流程定义
启动流程实例:
repositoryService.createDeployment().addResourceFromClasspath("demo.jpdl.xml").deploy(); ProcessInstance processInstance=executionService.startProcessInstanceByKey("demo"); |
使用executionService.startProcessInstanceByKey("demo");方法来启动一个流程实例。其中startProcessInstanceByKey就表示以key的方式来启动流程实例,key为流程定义文件中process节点的key属性,若未明确给出key属性,则默认key属性的值与name属性的值相同。
同样也可以使用executionService.startProcessInstanceById(processDefinitionId)的方式来启动流程实例。此方法是用流程定义文件中process节点的id属性来启动流程实例。
其Id属性由两部分组成流程定义的key和流程定义的版本来组成。形如key-version
例如:
ProcessInstance processInstance=executionService.startProcessInstanceById("demo-1");
其中demo-1就为流程定义中的流程Id,其key为demo,版本号为1
同样使用此方法可用来启动指定版本号的流程实例。
查看流程实例:
List<ProcessInstance> list=executionService.createProcessInstanceQuery().list(); for (ProcessInstance processInstance : list) { System.out.println("流程实例Id:"+processInstance.getId()); System.out.println("流程定义Id:"+processInstance.getProcessDefinitionId()); } |
级联删除流程实例:
executionService.deleteProcessInstanceCascade(processInstance.getId()); |
结束流程实例:
executionService.endProcessInstance(processInstance.getId(), "结束流程实例"); |
注意:在使用executionService.endProcessInstance()对流程实例进行结束操作后,需要重新查询processInstance才能得到更新后的流程实例,如果流程已结束,则查询结果为null
如:
executionService.endProcessInstance(processInstance.getId(), "结束流程实例"); System.out.println(processInstance.isEnded()); 此行代码是无意义的,因为此时并未获取到更新后的流程实例,需要重新查询流程实例,所以此处返回为false System.out.println("-----------查询流程实例--------------->"); List<ProcessInstance> list=executionService.createProcessInstanceQuery().list(); for (ProcessInstance processInstance : list) { System.out.println("流程实例Id:"+processInstance.getId()); System.out.println("流程定义Id:"+processInstance.getProcessDefinitionId()); } |
结果:
false
-----------查询流程实例--------------->
使流程向下执行:
在使用executionService启动流程实例后,流程会顺着向下执行(即启动流程实例后,流程会从start节点向下移动),在state或task节点,流程会暂停下来,满足条件后流程会向下继续执行,直到流程end节点,结束流程。
在程序中是流程遵循某一条件,沿着某个方向流动的方法为executionService.signalExecutionById();
该方法有多个重载:
ProcessInstance signalExecutionById(String executionId); //若在流程定义某一个节点没有分支时(只有一个transition时),调用此方法,可将流程继续向下执行 executionId为流程实例Id ProcessInstance signalExecutionById(String executionId, String signalName); //若在流程定义某一个节点有多个分支时(有多个transition时),调用此方法,可将流程沿着transition所指的方向向下执行 executionId为流程实例Id, signalName为流程定义中transition节点的name属性的值 ProcessInstance signalExecutionById(String executionId, String signalName, Map<String, ?> parameters); 用于将流程沿着signalName方向(transition的name属性所指的方向)向下继续执行,在执行的过程中顺便传递参数parameters ProcessInstance signalExecutionById(String executionId, Map<String, ?> parameters); 用于将流程向下继续执行,在执行的过程中顺便传递参数parameters |
注:当一个节点有多个分支时,若要通过signalExecutionById()方法将流程向下执行必须明确指出signalName即(transition的name属性所指的方向),否则流程不会向下执行,仍会停留在当前节点。因为jbpm不确定流程该流向那个方向。
示例代码:
1. 没有分支的state流向
流程定义文件:
<?xmlversion="1.0"encoding="UTF-8"?> <processname="demo"xmlns="http://jbpm.org/4.3/jpdl"> <startname="start"g="87,113,48,48"> <transitionname="to state"to="state"g="-53,-17"/> </start> <statename="state"g="238,236,92,52"> <transitionname="to end"to="end"g="-41,-17"/> </state> <endname="end"g="384,367,48,48"/> </process> |
测试代码:
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; publicclass DemoTest extends TestCase{ ProcessEngine processEngine; RepositoryService repositoryService; ExecutionService executionService; @Override protectedvoid setUp() throws Exception { processEngine=Configuration.getProcessEngine(); repositoryService=processEngine.getRepositoryService(); executionService=processEngine.getExecutionService(); //部署流程定义 repositoryService.createDeployment().addResourceFromClasspath("demo.jpdl.xml").deploy(); } publicvoid testProcessInstance(){ ProcessInstance processInstance=executionService.startProcessInstanceByKey("demo"); System.out.println("流程实例Id:"+processInstance.getId()); System.out.println("流程定义Id:"+processInstance.getProcessDefinitionId()); //判断当前是否位于start节点 System.out.println("是否位于start节点:"+processInstance.isActive("start")); //判断当前是否位于state节点 System.out.println("是否位于state节点:"+processInstance.isActive("state")); //判断流程是否结束 System.out.println("判断流程是否结束:"+processInstance.isEnded()); System.out.println("------------------------>使流程继续向下执行"); //使流程继续向下执行 //ProcessInstance instanceState=executionService.signalExecutionById(processInstance.getId()); //此处也可以这么写 ProcessInstance instanceState=executionService.signalExecutionById(processInstance.getId(),"to end"); //to end为流程定义中用于连接state和end节点之间transition的name属性的值 //判断当前是否位于state节点 System.out.println("是否位于state节点:"+instanceState.isActive("state")); //判断流程是否结束 System.out.println("判断流程是否结束:"+instanceState.isEnded()); } } |
执行结果:
流程实例Id:demo1.7 流程定义Id:demo1-1 是否位于start节点:false 是否位于state节点:true 判断流程是否结束:false ------------------------>使流程继续向下执行 是否位于state节点:false 判断流程是否结束:true |
2. 含有分支的state流向
流程定义文件:
<?xmlversion="1.0"encoding="UTF-8"?> <processname="demo"xmlns="http://jbpm.org/4.3/jpdl"> <startg="347,27,48,48"name="start"> <transitiong="-53,-17"name="to state"to="state"/> </start> <stateg="329,132,92,52"name="state"> <transitionname="to 200"to="200"g="-41,-17"/> <transitionname="to 400"to="400"g="-41,-17"/> </state> <endg="358,321,48,48"name="end"/> <statename="200"g="420,226,92,52"> <transitionname="to end"to="end"g="-41,-17"/> </state> <statename="400"g="266,225,92,52"> <transitionname="to end"to="end"g="-41,-17"/> </state> </process> |
测试代码:
import junit.framework.TestCase; public class Demo2Test extends TestCase{ ProcessEngine processEngine; RepositoryService repositoryService; ExecutionService executionService; @Override protected void setUp() throws Exception { processEngine=Configuration.getProcessEngine(); repositoryService=processEngine.getRepositoryService(); executionService=processEngine.getExecutionService(); //部署流程定义 repositoryService.createDeployment().addResourceFromClasspath("demo.jpdl.xml").deploy(); } public void testProcessInstance(){ ProcessInstance processInstance=executionService.startProcessInstanceByKey("demo"); System.out.println("流程实例Id:"+processInstance.getId()); System.out.println("流程定义Id:"+processInstance.getProcessDefinitionId()); //判断当前是否位于start节点 System.out.println("是否位于start节点:"+processInstance.isActive("start")); //判断当前是否位于state节点 System.out.println("是否位于state节点:"+processInstance.isActive("state")); //判断流程是否结束 System.out.println("判断流程是否结束:"+processInstance.isEnded()); System.out.println("------------------------>使流程继续向下执行"); //不明确指出流动方向,看流程位于那个节点 ProcessInstance instance=executionService.signalExecutionById(processInstance.getId()); //判断当前是否位于state节点 System.out.println("是否位于state节点:"+instance.isActive("state")); //判断流程是否结束 System.out.println("判断流程是否结束:"+instance.isEnded()); } } |
执行结果:
流程实例Id:demo.7 流程定义Id:demo-1 是否位于start节点:false 是否位于state节点:true 判断流程是否结束:false ------------------------>使流程继续向下执行 是否位于state节点:true 判断流程是否结束:false |
指明流向节点:
ProcessInstance processInstance=executionService.startProcessInstanceByKey("demo"); System.out.println("------------------------>使流程继续向下执行"); System.out.println("------------------------>使流程流向200"); ProcessInstance processInstance200=executionService.signalExecutionById(processInstance.getId(), "to 200"); System.out.println("当前流程是否位于200节点---->"+processInstance200.isActive("200")); System.out.println("当前流程是否结束---->"+processInstance200.isEnded()); /*System.out.println("------------------------>使流程流向400"); ProcessInstance processInstance400=executionService.signalExecutionById(processInstance.getId(), "to 400"); System.out.println("当前流程是否位于400节点---->"+processInstance400.isActive("400")); System.out.println("当前流程是否结束---->"+processInstance400.isEnded());*/ |
执行效果:
------------------------>使流程继续向下执行 ------------------------>使流程流向200 当前流程是否位于200节点---->true 当前流程是否结束---->false |
上述代码中使用signalExecutionById()方法时,传入的是流程实例的Id,也可以使用以下代码来完成同样的工作:
ProcessInstance processInstance=executionService.startProcessInstanceByKey("demo"); //查询该流程实例的活动节点 System.out.println(processInstance.findActiveActivityNames()); //因为流程实例启动后,它会自动向下执行,直到遇到state或task等节点时暂停下来,在我们的流程定义文件中紧跟在start后的节点为state,所以流程实例会在state节点暂停下来 Execution execution=processInstance.findActiveExecutionIn("state"); ProcessInstance processInstance200=executionService.signalExecutionById(execution.getId(), "to 200"); System.out.println("当前流程是否位于200节点---->"+processInstance200.isActive("200")); System.out.println("当前流程是否结束---->"+processInstance200.isEnded()); //使流程继续向下执行(结束) System.out.println("-------使流程继续向下执行(结束)------->"); ProcessInstance instance=executionService.signalExecutionById(processInstance200.getId()); System.out.println("当前流程是否结束---->"+instance.isEnded()); |
执行结果:
[state] 当前流程是否位于200节点---->true 当前流程是否结束---->false -------使流程继续向下执行(结束)-------> 当前流程是否结束---->true |
关于流程实例几个重要的方法:
processInstance.isEnded()判断程实例是否结束结束返回true,否则返回false
processInstance.isActive(“A”)判断当前流程是否处于A节点
谨记executionService.signalExecutionById(String executionId, String signalName)方法中executionId为流程实例Id,signalName为流程向下执行的transition的name属性的值,而不是下一个节点的名称。
出处http://www.blogjava.net/sxyx2008/
相关推荐
简单描述流程引擎相关概念和以jbpm7为基础的开发方式和实现方式做简单的说明
第一篇 jBPM工作流开发基础 1 第1章 工作流基础 2 1.1 工作流概念 2 1.1.1 工作流管理思想之于企业现代化管理 2 1.1.2 工作流技术在企业中的应用 5 1.1.3 如何从一个开发者的角度看工作流技术 6 1.2 工作流管理系统...
介绍JBPM的基本流程概念、实例执行的概念及使用JBPM的区别
工作流引擎的简单介绍,对于概念和基本架构讲述的比较清楚,需要了解工作流的可以看。
工作流基本概念及jbpm简介PPT,这是公司内部培训PPT,是初学入门的好课件,推荐给大家。
工作流基本概念及JBPM简介
工作流基本概念简介 工作流系统功能特性描述 开源工作流引擎jBpm的介绍
jbpm中最重要的概念,应该是令牌(Token)和信令(Signal)。在整个流程实例运行过程中,我们可以迅速的利用token得到其当前的current state。在解决“并行”等(比如Fork)问题时,jBpm让Token对象维护了父子关系,这种...
JBPM4.4教程,内含jbpm表结构的搭建,流程的基本流转过程,以及重要概念的详细讲解
建议读者先自行上网了解jbpm的基本概念以及流程的定义等基础知识,在理解了jbpm的基础之上学习这份文档会有更大的收获!
工作流基本概念及jBpm简介 适用于刚接触工作流、jbpm
...................................15 1.3.3 测试helloworld流程......................16 第 2 章 jBPM 基础...........................................19 2.1 JbpmConfiguration和 JbpmContext..................
一、流程定义的基本概念: 二、流程执行的基本概念: 三、流程引擎核心调度过程 ----------------------- jbpm的实现流程图全文共3页,当前为第1页。 jbpm的实现流程图全文共3页,当前为第2页。 ࠀ࠘ࠚࠜࣾऀंऄआ...
jbpm在OA系统中的应用,2007年的硕士论文,有点老,了解基本概念可以
Jbpm 工作流在普通的应用中,基本上对数据库进行一次操作代表着一个业务的发生,等操作完成后,也就标示着业务的完成。例如用户注册这个业务。只要向数据库中添加一条记录,就标示着业务的完成。 但是对于一个报销...
火龙果软件工程技术中心 1前言 2阅读本篇的基础准备 2.1概念的基础 2.2环境的基础 3什么是流程引擎内核? 4引擎内核所关注的四个主要问题 4.1模型与定义对象 4.2调度机制与算法 4.3执行机制与状态 4.4实例...
...................................15 1.3.3 测试helloworld流程......................16 第 2 章 jBPM 基础...........................................19 2.1 JbpmConfiguration和 JbpmContext..................
2.工作流的基本概念 12 2.1 WFMC对工作流的定义 12 2.2 业务流程 16 2.2.1概念 16 2.2.2 业务流程定义语言的介绍 17 2.2.3 业务流程的建立需要遵循的原则 18 2.3 工作流中间件 18 2.3.1 工作流中间件的概念 18 ...
jbpm4.4入门学习的好文档 1.工作流基础 2.开发环境 3.核心概念与相关api 4.processenginee serviceapi 5.管理流程定义 6.执行流程实例 7.流程定义语言 8.应用 与其他框架的集成