工作流系统是以规格化的流程描述作为输入的软件组件,它维护流程的运行状态,并在人和应用之间分派活动。
一些基本的术语:
流程定义(process definition)是一个业务流程或过程的规格化描述。
流程实例(process instance). 是流程定义的一个运行实体。
流程上下文变量(process context variable) ,或简称变量,是与流程实例相关的变量
<o:p> </o:p>
package com.sample;<o:p></o:p>
<o:p> </o:p>
import junit.framework.TestCase;<o:p></o:p>
import org.jbpm.graph.def.ProcessDefinition;<o:p></o:p>
import org.jbpm.graph.exe.ProcessInstance;<o:p></o:p>
import org.jbpm.graph.exe.Token;<o:p></o:p>
<o:p> </o:p>
public class testHelloWorldProcess extends TestCase {<o:p></o:p>
public void testHelloWorldProcess() {<o:p></o:p>
// 这个方法展现流程定义和流程执行的定义<o:p></o:p>
// 流程定义有3个节点.<o:p></o:p>
// 一个未命名的开始状态start-state,一个状态 's'<o:p></o:p>
// 一个结束状态名字为'end'.<o:p></o:p>
// 下面行解析一个xml text为一个ProcessDefinition对象(流程定义)<o:p></o:p>
// ProcessDefinition 把流程定义形式描述为java对象<o:p></o:p>
ProcessDefinition processDefinition = ProcessDefinition<o:p></o:p>
.parseXmlString("<process-definition>" + " <start-state>"<o:p></o:p>
+ " <transition to='s' />" + " </start-state>"<o:p></o:p>
+ " <state name='s'>" + " <transition to='end' />"<o:p></o:p>
+ " </state>" + " <end-state name='end' />"<o:p></o:p>
+ "</process-definition>");<o:p></o:p>
<o:p> </o:p>
// 下一行建立了一个流程执行定义.<o:p></o:p>
// 在构造后,流程执行有一个主要的执行路径<o:p></o:p>
// (= root token 根令牌) 此时位置在start-state处<o:p></o:p>
ProcessInstance processInstance = new ProcessInstance(processDefinition);<o:p></o:p>
<o:p> </o:p>
// 在构造后流程执行有一个主要的执行路径<o:p></o:p>
// (= roottoken 根令牌) .<o:p></o:p>
Token token = processInstance.getRootToken();<o:p></o:p>
<o:p> </o:p>
// 构造后, 位置处于流程定义执行路径start-state的位置<o:p></o:p>
assertSame(processDefinition.getStartState(), token.getNode());<o:p></o:p>
<o:p> </o:p>
// 现在开始流程执行,离开start-state 结束默认的转换(transition)<o:p></o:p>
token.signal();<o:p></o:p>
// 这个signal方法将会阻塞直到流程执行进入 wait 状态<o:p></o:p>
<o:p> </o:p>
// 流程执行在状态's' 进入第一个 等待状态<o:p></o:p>
// 因此执行主路径现在位置在 状态's'<o:p></o:p>
assertSame(processDefinition.getNode("s"), token.getNode());<o:p></o:p>
<o:p> </o:p>
// 我们再送另外一个信号signal. 这将继续执行离开状态's' 结束默认的转换(transition)<o:p></o:p>
token.signal();<o:p></o:p>
// 现在信号signal方法将返回,因为流程实例到达了end-state 结束状态<o:p></o:p>
<o:p> </o:p>
assertSame(processDefinition.getNode("end"), token.getNode());<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
}<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
对于流程定义可以要用JBoss的图形自动生成
<o:p><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 311.25pt" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\pengch\LOCALS~1\Temp\msohtml1\01\clip_image001.png" o:title="ScreenShot047"></v:imagedata></v:shape></o:p>
<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 311.25pt" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\pengch\LOCALS~1\Temp\msohtml1\01\clip_image001.png" o:title="ScreenShot047"></v:imagedata></v:shape><o:p></o:p>
点击source会生成下面的代码:<o:p></o:p>
<?xml version="1.0" encoding="UTF-8"?><o:p></o:p>
<o:p> </o:p>
<process-definition<o:p></o:p>
xmlns="urn:jbpm.org:jpdl-3.1" name="test"><o:p></o:p>
<start-state name="start"><o:p></o:p>
<transition name="" to="s"></transition><o:p></o:p>
</start-state><o:p></o:p>
<o:p></o:p>
<state name="s"><o:p></o:p>
<transition name="" to="end"></transition><o:p></o:p>
</state><o:p></o:p>
<o:p></o:p>
<end-state name="end"></end-state><o:p></o:p>
</process-definition><o:p></o:p>
可以把加载流程定义文件,<o:p></o:p>
ProcessDefinition processDefinition = ProcessDefinition<o:p></o:p>
.parseXmlString("<process-definition>" + " <start-state>"<o:p></o:p>
+ " <transition to='s' />" + " </start-state>"<o:p></o:p>
+ " <state name='s'>" + " <transition to='end' />"<o:p></o:p>
+ " </state>" + " <end-state name='end' />"<o:p></o:p>
+ "</process-definition>");<o:p></o:p>
<o:p> </o:p>
改为:<o:p></o:p>
<o:p> </o:p>
FileInputStream fis = new FileInputStream("processes/test/processdefinition.xml");<o:p></o:p>
ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(fis);<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
<v:shape id="_x0000_i1026" style="WIDTH: 24pt; HEIGHT: 24pt" type="#_x0000_t75" alt="The auction process graph"></v:shape><o:p></o:p>
<v:shape id="_x0000_i1027" style="WIDTH: 339pt; HEIGHT: 306pt" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\pengch\LOCALS~1\Temp\msohtml1\01\clip_image004.gif" o:href="mk:@MSITStore:E:\Jboss\jbpm3\jbpm3.chm::/images/auction.process.graph.gif"></v:imagedata></v:shape>
对应的流程定义文件为:<o:p></o:p>
<process-definition><o:p></o:p>
<o:p> </o:p> <start-state><o:p></o:p>
<transition to="auction" /><o:p></o:p>
</start-state><o:p></o:p>
<state name="auction"><o:p></o:p>
<transition name="auction ends" to="salefork" /><o:p></o:p>
<transition name="cancel" to="end" /><o:p></o:p>
</state><o:p></o:p>
// fork表示要进行分叉的情形 <o:p></o:p>
//一个分支把一个执行路线分割成多个兵法的执行路线. 默认分支的行为是为每个离开分支转换建立一个子令牌,在令牌要到达的分支之间建立一个父母-子女 关系.<o:p></o:p>
<fork name="salefork"><o:p></o:p>
<transition name="shipping" to="send item" /><o:p></o:p>
<transition name="billing" to="receive money" /><o:p></o:p>
</fork><o:p></o:p>
<state name="send item"><o:p></o:p>
<transition to="receive item" /><o:p></o:p>
</state><o:p></o:p>
<o:p> </o:p> <state name="receive item"><o:p></o:p>
<transition to="salejoin" /><o:p></o:p>
</state><o:p></o:p>
<state name="receive money"><o:p></o:p>
<transition to="send money" /><o:p></o:p>
</state><o:p></o:p>
<o:p> </o:p> <state name="send money"><o:p></o:p>
<transition to="salejoin" /><o:p></o:p>
</state><o:p></o:p>
//join表示要进行合并在一起的情形 <o:p></o:p>
//默认联合(join)假设所有来自同一个父母的子令牌联合.当在上使用fork(分支)这个情形就出现了并且所有令牌分支建立,并且到达同一个联合(join).当全部令牌都进入联合的时候,联合就结束了. 然后联合将检查父母-子女. 当所有兄弟令牌到达联合(join),父母令牌将传播(唯一的)离开转换. 当还有兄弟令牌活动时,联合的行为将作为等待状态.<o:p></o:p>
<o:p> </o:p> <join name="salejoin"><o:p></o:p>
<transition to="end" /><o:p></o:p>
</join><o:p></o:p>
<end-state name="end" /><o:p></o:p>
</process-definition><o:p></o:p>
<o:p> </o:p><o:p> </o:p>
参考资料:http://dl2.csdn.net/down4/20070802/02094345367.swf<o:p></o:p>
分享到:
相关推荐
jbpm学习笔记主要涵盖了jbpm(Java Business Process Management)的多个方面,包括Signavio的使用和配置、jBPM数据库的安装、Graphical Process Designer(GPD)的安装以及jBPM在Eclipse环境中的配置。以下是这些...
在提供的压缩包中,“JBossjBPM.nh”可能是一个笔记或文档文件,详细介绍了在实际项目中使用JBoss jBPM的经验和技巧。通常,这种文件会涵盖以下内容: 1. 安装与配置:如何在本地环境中设置jBPM,包括依赖库的导入和...
### JBPM学习笔记 #### 一、JBPM概述 JBPM是Java Business Process Management的缩写,即Java业务流程管理,这是一个开源的工作流框架。它不仅涵盖了传统的业务流程管理(BPM)、工作流管理和服务之间的协作,还...
**JBPM4学习笔记概述** JBPM(JBoss Business Process Management)是一款开源的工作流程管理系统,主要专注于业务流程的建模、执行和监控。JBPM4是JBPM的第四个主要版本,它提供了一整套工具和服务,使得企业能够...
1. **流程定义文件**:在JBPM中,流程的定义通常是以XML文件的形式存储,遵循特定的JPDL(JBoss Process Definition Language)语法。这个文件描述了整个业务流程的结构和行为。在示例中,报销审批流程的XML文件定义...
jBPM(JBoss Business Process Management业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。 jPDL是构建于jBPM框架上的流程语言之一。在jPDL...
jBPM,全称JBoss Business Process Management,是一款强大的开源业务流程管理框架,它涵盖了业务流程管理、工作流和服务协作等多个领域。jBPM的核心在于它的可执行流程语言,其中包括了jPDL(jBPM Process ...
工作流学习笔记主要聚焦在企业级业务流程管理(Business Process Management, BPM)系统,特别是针对JBoss提供的开源工作流框架JBOSS jBPM。jBPM是一个强大的工作流引擎,它允许开发者定义、执行和管理工作流程。这...
通过本文档的学习,相信读者已经对jBPM有了较为全面的认识。jBPM不仅提供了强大的工作流管理功能,还支持灵活的定制化需求。对于希望改善内部业务流程的企业来说,jBPM无疑是一个值得考虑的选择。未来随着技术的不断...
这个框架是开源的,基于Apache许可,由Alfresco公司发起,并由前JBoss jBPM项目架构师Tom Baeyens创建。 在第一天的学习中,首先了解了工作流的基本概念。工作流是指在计算机环境中自动化执行的业务过程,通常涉及...