`
AngelAndAngel
  • 浏览: 234373 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jbpm学习笔记(七) fork-join活动详解以及示例,对处理流程的一点想法

    博客分类:
  • jbpm
阅读更多
   今天继续学习jbpm活动元素之 fork-join(分支/聚合活动)

   当我们需要流程并发(concurrency)执行的时候,就需要使用到fork-join活动组合,fork活动可以使流程在一条主干上出现并行的分支,join活动则可以使流程的并行分支聚合成一条主干。
Fork活动仅具有jbpm活动的最基本特征,即具有1个name属性和n个流出转移元素。
相关jpdl如下:
<?xml version="1.0" encoding="UTF-8"?>

<process name="forkAndJoin" xmlns="http://jbpm.org/4.4/jpdl">
	<start>
		<transition to="fork" />
	</start>

	<!-- 流程在此产生 3个并行的分支 -->
	<fork name="fork">
		<transition to="pingpang" />
		<transition to="football" />
		<transition to="basketball" />
	</fork>

   
	<state name="pingpang">
		<transition to="to playball" /><!-- 就是打一般的球 -->
	</state>

    <!-- 足球和篮球属于大球  会join到to play bigball活动上去-->
	<state name="football">
		<transition to="to play bigball" />
	</state>

	<state name="basketball">
		<transition to="to play bigball" />
	</state>
	

	<!-- 在此定义to play bigball的join活动  -->
	<join name="to play bigball">
		<transition to="play bigball" /> <!-- 开始打大球 -->
	</join>

	<state name="play bigball">
		<transition to="to playball" /><!-- 其实是一起去打普通的球 -->
	</state>
	
	
	<join name="to playball">
		<transition to="play over" /><!-- 打球马上结束了 -->
	</join>
	
	<end name="play over"/>
	
	
</process>


编写单元测试代码执行上面的流程定义

package org.test;

import java.util.HashSet;
import java.util.Set;

import org.jbpm.api.ProcessInstance;
import org.jbpm.test.JbpmTestCase;

public class ForkAndJoinTest extends JbpmTestCase {

	String deploymentId;

	@Override
	public void setUp() throws Exception {
		super.setUp();
		deploymentId = repositoryService.createDeployment()
				.addResourceFromClasspath("org/test/forkAndJoin.jpdl.xml")
				.deploy();
	}

	@Override
	public void tearDown() throws Exception {
		repositoryService.deleteDeploymentCascade(deploymentId);
		super.tearDown();
	}

	public void testForkAndJoin() {
		// 发起forkAndJoin流程实例
		ProcessInstance pi = executionService
				.startProcessInstanceByKey("forkAndJoin");
		String pid = pi.getId();

		// 构造一个活动名称集合以验证分支。设置3个分支活动的名称
		Set<String> ballsName = new HashSet<String>();
		ballsName.add("pingpang");
		ballsName.add("football");
		ballsName.add("basketball");

		// 断言当前活动即为产生的3个分支
		assertEquals(ballsName, pi.findActiveActivityNames());

		// 发出执行信号通过 "pingpang" 活动,这时候,流程会在最后的聚合活动"play"上等待其他分支的到来
		String pingpangExecuId = pi.findActiveExecutionIn("pingpang").getId();
		pi = executionService.signalExecutionById(pingpangExecuId);
		// 在活动名称集合中排除 "pingpang"活动
		ballsName.remove("pingpang");

		// 此时,仍然可以断言另外2个分支还在等待
		assertNotNull(pi.findActiveExecutionIn("football"));
		assertNotNull(pi.findActiveExecutionIn("basketball"));

		// 发出执行信号通过剩下的其中一个分支--football活动
		String footballExecuId = pi.findActiveExecutionIn("football").getId();
		pi = executionService.signalExecutionById(footballExecuId);
		// 在活动名称集合中排除 "football"活动
		ballsName.remove("football");

		// 发出执行信号通过剩下的第二个分支--basketball活动
		String basketballExecuId = pi.findActiveExecutionIn("basketball")
				.getId();
		pi = executionService.signalExecutionById(basketballExecuId);
		// 在活动名称集合中排除"basketball"活动
		ballsName.remove("basketball");

		// size应该是0
		System.out.println("ballsName.size(): " + ballsName.size());

		// 断言通过了第一个聚合活动 "to play bigball",到达了"play bigball"活动
		assertNotNull(pi.findActiveExecutionIn("play bigball"));
		
		//发出执行信号通过"play bigball"活动
		String playBigBallExecuId=pi.findActiveExecutionIn("play bigball").getId();
		pi=executionService.signalExecutionById(playBigBallExecuId);
		
		//最终的聚合活动"play over"等到了它的最后一个流入转移后,流向了end活动,所以流程实例结束
		
		//因此可以断言此流程已经不存在了.
		assertNull("execution"+pid+"应该不存在了",executionService.findExecutionById(pid));
		System.out.println("结束了");
	}

}

     Fork-join活动看似其实不难,但是当流程变多的时候,我感觉在写代码的时候容易弄混淆,比如,流程在某个阶段执行到哪儿了,该怎样启动下一个流程,甚至有时候感觉有的state根本不需要,不知道其他人是否这样的感觉,但是我要说的是,假如真的能够体会你自己业务的每一步骤的话,就不会出现这种混乱的思想,举个简单的例子:假如有这样一个逻辑,某一个订单在发货后,1,客户要接收,2厂家要收款。这两个活动都完成了,那么才能结束流程,首先,你应该这样去考虑它们的步骤:发订单——》客户接收——客户打钱——厂家收款——销账(完成)。假如把这个过程再细化的话,首先发完订单,客户处于待接收状态,货到后客户可以接收,就变成待打钱状态,此时厂家就处于待收款状态,厂家收款后,销账完成。而这个细化的过程即基于每个状态点(如待接收状态),然后激起流程转移的动作(如接收),使我们真正在处理流程的过程。由于篇幅原因,下一张再介绍end等活动。
分享到:
评论
2 楼 AngelAndAngel 2011-04-02  
chenkeming 写道
我是在main函数里写的fork的实现(和你一样的方法),它会报
Exception in thread "main" java.lang.NullPointerException
	at test.Test.main(Test.java:99)

这个错误,要怎么解决?

这个和jbpm没什么关系
1 楼 chenkeming 2011-04-01  
我是在main函数里写的fork的实现(和你一样的方法),它会报
Exception in thread "main" java.lang.NullPointerException
	at test.Test.main(Test.java:99)

这个错误,要怎么解决?

相关推荐

    jbpm下载 jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)

    jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载 jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载

    jbpm-jpdl-suite-3.2.3安装配置.doc

    在配置jbpm-jpdl-suite-3.2.3的过程中,需要注意以下几个关键步骤: 1. **环境准备**: - 首先,确保你已经安装了JDK 1.6,因为jbpm-jpdl-suite-3.2.3需要依赖Java运行环境。 - 安装Ant 1.7.1,这是一个Java编译...

    jbpm-starters-kit-3.1.2.part2.rar

    jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,共两卷

    jbpm7示例(jbpm-7.3.0.Final-examples)

    2017年jBPM 正式发布了全新的 7版本。jBPM 是一个完全开源的业务流程管理(BPM)和案例管理解决方案。它支持流程和案例的完整生命... &lt;artifactId&gt;jbpm-test &lt;version&gt;7.3.0.Final 这与Gradle,Ivy和Buildr类似。

    jbpm-jpdl-suite-3.2.3.zip

    jbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3....

    jbpm-7.3.0.Final-bin 工作流

    4. **审计与日志**:jbpm-audit-7.3.0.Final.jar和jbpm-human-task-audit-7.3.0.Final.jar用于记录流程实例和任务活动的审计信息,这对于流程跟踪和审计至关重要。 5. **ejb服务与定时器**:jbpm-services-ejb-...

    jbpm-jpdl-designer-nodeps-3.1.4

    "jbpm-jpdl-designer-nodeps-3.1.4" 是一个针对Jbpm工作流管理系统中的JPDL设计工具的无依赖版本,主要用于创建和编辑JPDL(Jbpm Process Definition Language)文件。该资源包含了该工具的详细文档、许可证协议以及...

    jbpm4.4 会签 测试( fork & join)

    在jbpm中,"fork & join"机制是实现并行处理和流程控制的关键概念,尤其在处理会签(多个审批人同时参与审批)等场景时显得尤为重要。 "fork"在jbpm中指的是流程分支,当流程到达一个fork节点时,流程会分裂为多个...

    jbpm-starters-kit-3.1.2.zip官方下载地址

    jbpm-starters-kit-3.1.2.zip官方...版本里包括一个JBPM流程设计器的Eclipse插件,和一个用JBOSS作为服务器的示例流程等相关文件。解压jbpm-starters-kit-3.1.2.rar到某个特定目录,这里我们首先用到的是包里的JBPM目

    jbpm-jpdl-designer-site-3.1.7.zip

    jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip

    jbpm-6.1.0.Final-installer

    jbpm-6.1.0.Final-installer是JBoss Business Process Management (jBPM)的一个发行版本,它是一个开源的工作流和业务流程管理(BPM)框架,由Red Hat公司开发并维护。jBPM旨在帮助企业和组织设计、执行、管理和监控...

    jbpm-jpdl-suite-3.2.GA.zip-6

    jbpm-jpdl-suite-3.2.GA.zip

    工作流jbpm中join与fork用法

    在JBPM中,`Join` 和 `Fork` 是两个重要的流程节点,它们用于控制流程执行的路径。本文将详细讲解这两个概念以及它们在实际工作流中的应用。 首先,我们来看`Fork`节点。`Fork`在流程图中表现为一个分支,它代表了...

    jbpm-jpdl-suite-3.2.GA.zip-3

    jbpm-jpdl-suite-3.2.GA.zip

    jbpm-jpdl-suite-3.2.GA.zip-5

    jbpm-jpdl-suite-3.2.GA.zip

    jbpm5.2学习1------安装与配置

    5. **jbpm-examples**: 示例项目,用于学习和测试jbpm的功能。 **安装步骤**: 1. **设置环境变量**:确保JDK已安装并设置好`JAVA_HOME`环境变量,因为jbpm需要Java运行环境。 2. **配置数据库**:jbpm默认使用H2...

    jbpm-jpdl-suite-3.2.3的安装配置

    - **samples**目录:提供了一些示例项目,帮助用户了解如何使用jBPM-jPDL实现具体业务流程。 安装配置jBPM-jPDL-suite-3.2.3通常涉及以下步骤: 1. 下载并解压jbpm-jpdl-suite-3.2.3.zip。 2. 根据你的数据库环境,...

    工作流引擎jbpm学习笔记

    工作流引擎jbpm学习笔记 jbpm是一个专业的工作流引擎,用于定义、管理和执行业务流程。它可以帮助我们简化工作流程的开发和维护,提高工作效率和可扩展性。 一、什么是公文流转? 公文流转是指公文在定义流转中的...

    jbpm-flow-builder-5.1.0.Final.jar

    jbpm-flow-builder-5.1.0.Final.jar jbpm5

Global site tag (gtag.js) - Google Analytics