- 浏览: 35577 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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/
相关推荐
总的来说,这个主题资料包提供了jbpm4和jbpm5的基础知识、实战经验和用户操作指导,对于想要学习或深化jbpm流程管理框架理解的开发者非常有价值。通过学习这些文档,开发者可以掌握jbpm的核心概念,熟练地设计和部署...
- **基础概念:** 介绍工作流、BPMN(业务流程建模符号)、jBPM4中的关键术语和概念,帮助开发者建立基础知识体系。 - **流程定义:** 深入讲解jPDL、流程图的创建和编辑,让开发者学会如何定义业务流程。 - **...
**JBPM4 开发文档详解** JBPM4(Java Business Process Management 4)是一个轻量级的开源工作流管理系统,基于...对于开发人员来说,理解这些核心概念和数据库表结构,能更好地掌握和应用jBPM4进行业务流程自动化。
jbpm4是一个基于Java的...通过深入研究这个“jbpm4 完整的请假流程”,不仅可以掌握jbpm4的基本用法,还能理解业务流程管理系统的运作机制,这对于在实际工作中设计和实现复杂的企业级流程管理解决方案具有重要意义。
2. **示例项目**:通过官方提供的示例项目,可以快速理解JBPM4的基本用法。 3. **社区与论坛**:如ITEYE博客中的"obullxl"博主分享的经验,以及JBPM社区,可以获取到实时的问题解答和最佳实践。 总结来说,JBPM4是...
**jbpm4实例源码详解** ...通过研究这个jbpm4实例源码,开发者不仅可以了解jbpm4的基本概念,还能学习到如何在实际项目中部署和运行流程。这将极大地提升开发者的业务流程管理能力,使其能够高效地实现企业流程自动化。
它包含了执行上下文(如当前活动、变量等)的详细信息,是JBPM4实现其核心执行逻辑的关键表之一。 #### 7. `JBPM4_TASK` `JBPM4_TASK`表用于管理任务。每个任务都关联着一个或多个活动,并且可以包含分配给特定...
- **注意事项**: 虽然JBPM4提供了基本的身份认证功能,但在实际应用中可能需要根据具体需求进行扩展或替换。 #### 四、操作信息变化 在使用JBPM4进行流程管理时,不同的操作会导致相应的表发生变化。例如: - **...
"JBPM3.1Help(中文).chm"可能包含了关于jbpm3的安装步骤、API使用、工作流设计等方面的中文帮助文档,这对于初学者了解jbpm3的基础操作和核心概念非常有帮助。 "jbpm开发指南.pdf"可能是对jbpm4或更高版本的开发者...
首先,我们需要了解jbpm4的基本概念,包括工作流定义(Workflow Definition)、任务(Task)、节点(Node)以及流程实例(Process Instance)。jbpm4通过 BPMN 2.0 标准提供了一种可视化的方式来设计这些流程。 在...
51CTO下载的《jBPM4工作流应用开发指南》PDF文件是其中的一份详细的学习资料,涵盖了从基础概念到高级用法的全面指导。 通过学习和实践jBPM4,开发者能够构建出灵活、可扩展且易于维护的工作流应用,以满足企业复杂...
9. **jBPM4常见概念**:这部分会列举并解释jbpm4中的重要术语,如流程图、泳道、节点、连接线等,有助于理解工作流模型的基本构造。 这些文档集合为学习和掌握jbpm4提供了全面的资源,从基础到高级,从理论到实践,...
这个“请假例子”旨在帮助初学者快速理解JBPM4的基本概念和操作。 1. **流程定义**:在JBPM4中,业务流程是通过BPML(Business Process Modeling Language)或者BPMN(Business Process Model and Notation)来定义...
- **JBPM4_ID_GROUP**,**JBPM4_ID_MEMBERSHIP**,**JBPM4_ID_USER**:身份认证相关表,管理用户、组和成员关系。 - **JBPM4_JOB**:定时任务表,用于调度未立即执行的操作。 - **JBPM4_LOB**:存储大型对象,如...
3. **SQL脚本**:用于创建和初始化数据库表的SQL文件,这是JBPM4运行的基础,因为流程实例、任务和其他元数据需要存储在数据库中。 4. **测试用例**:可能包含测试流程执行和审批逻辑的JUnit或其他测试框架的测试类...
这个例子可以帮助开发者理解工作流管理系统的基本概念,以及如何将它们集成到实际的Web应用程序中。 JBPM4是一个开源的工作流管理系统,它提供了一整套用于设计、执行和管理业务流程的工具和服务。JBPM4的核心功能...
- 下一代版本JBPM5放弃了JBPM4的基础代码,导致JBPM4的后续支持存在不确定性。 - 流程管理的可视化程度较低,对业务人员的支持有限。 - 高并发环境下可能存在性能问题。 2. **JBPM5** - **架构简介**:JBPM5...
在深入探讨jbpm4设计器的Application化雏形之前,我们首先要理解jbpm4的基本概念。jbpm4是一款开源的工作流管理系统,它提供了强大的工作流建模、执行和监控功能。在这个系统中,设计器是用户与流程模型交互的重要...
总的来说,理解并实践JBPM4实例,如"LeaveJbpm",不仅可以让你熟悉流程管理的基本概念,还能帮助你掌握如何在实际项目中应用这些知识,提升业务流程自动化的能力。通过不断的学习和实践,你将能够熟练地运用JBPM4...
1. 阅读基础理论:先了解jbpm4.4的基本概念、架构和核心组件。 2. 学习流程设计:掌握BPMN 2.0语言,学习如何在jbpm中创建和编辑流程模型。 3. 实践操作:通过示例代码和项目实践,熟悉jbpm的部署、运行和管理工作...