下面开始接触 JBPM 的 JPDL 部分:
在 jpdl 参考手册中主要介绍了 processdefinition.xml 文件的格式( schema )
一、 Process archive:
如前面所描述的, process archive 是商务流程的规则描述。它被打成 jar 包,通常以扩展名 .par 结束, jbpm 识别一个流程需要三种类型的文件数据:
1、 业务流程的正式声明:在 jpdl 中,是以 processdefinition.xml 文件来表达。这一章节我们就来解析这个文件的格式。
2、 设计逻辑:在流程上加上规划逻辑这些也是在 processdefinition.xml 中给予描述的,在 process archive 中可以嵌套 java-classes 。所有在 process archive 中的 classes 应该放在子目录 /classes 中。
3、 其他资源文件。作为工作流引擎的客户端,在运行时你可能想要在流程中包含一些资源文件的变量。例如。窗体( form )的描述与某人执行任务相关联。 Jbpm 不能在你想要包含在一个流程定义中的资源文件的类型上做任何手脚。
二、 version 机制(此处 versioning 可以大致理解为:一个 process archive 部署后转变成过程定义的过程。)(此部分需要参考原文理解。感觉不对劲)
作为最最基本的, jbpm 的翻译机制遵从下面原理:
l 每次 process archive 部署的时候,一个新的流程定义就在 jbpm 数据库中被创建。
l 在部署的时候, jbpm 安排一个 version 号码(数字)给过程定义。只有当过程名与被定义的号相同时候才会执行 Process archives 。为了实现安排 version 号码,如果它是第一个 version jbpm 采取 1+ (the highest version number of the current process definitions with the same name) 或者 1 。从 jbpm-api 中可以通过一个给定的 name 查找最近的过程定义。
l 在一个给定的定义执行某一个过程实例,过程实例将会(等到同个定义结束前)一直在这个定义中保持执行状态。
l 通过这种方式能通过最近定义启动过程并且在相同定义中的完整的生命周期中保持运行状态。
l 注意: jbpm 可以把一个设计的程序逻辑与一个过程相关联起来。通过在 process archive 中包含类文件, jbpm 将会对于每个过程定义把 classes 分离出来。
三、 Processdefinition.xml 格式
文档类型定义:
<!DOCTYPE process-definition PUBLIC
"-//jBpm/jBpm Mapping DTD 2.0 beta3//EN"
"http://jbpm.org/dtd/processdefinition-2.0-beta3.dtd">
the document type definition of processdefinition.xml
过程定义:
<!ELEMENT process-definition ( description?,
swimlane*,
type*,
start-state,
( state |
milestone |
process-state |
decision |
fork |
join
)*,
end-state,
action* ) >
<!ATTLIST process-definition name CDATA #REQUIRED >
dtd fragment for process-definition
状态:
<!ELEMENT state ( description?, assignment?, action*, transition+ ) >
<!ATTLIST state name CDATA #REQUIRED >
dtd fragment for a state
在 JBPM 中,状态( state )这个术语与 FSM (有限状态机)和 UML 状态图中有着同样的意思。
对商务流程进行建模的目的就是创建一个软件系统。我们考虑到过程定义是软件系统建立的一部分。所以 jbpm 中的状态术语是以一个软件系统的角度来解释的。
状态是 jbpm 的核心概念。在 jbpm 中当开始模仿一个流程,首要需要考虑的事情就是过程的状态。状态将成为你所设计的过程的基本框架。
以状态概念为核心的另外一个特殊原因是:状态在程序语言中没有容易重复混淆的概念。一个软件程序或者运行或者不运行。一个有代表性的商业过程都会与被分别执行的所设计的逻辑部分关联。 Jbpm 允许在相关联的程序逻辑中对状态建模。
Jpdl 也在状态之间定义了变迁,决定,分支,合并, milestone ( flow )。需要注意的,控制流定义在状态与状态之间。无论什么情况下,一个正常的设计逻辑是更合适的,过程开发人员就能够在一个过程事件上指定一个 action 。 Jbpl 与其他过程定义语言如 bpel 等之间的区别之一是, jpdl 具备以状态管理方式对 java 进行扩展和与程序语言最小交叠性的能力。
委派( assignment ):
<ELEMENT assignment EMPTY >
<!ATTLIST assignment swimlane CDATA #IMPLIED
assignment (optional |required) #IMPLIED
authentication (optional |required|verify) #IMPLIED >
dtd fragment for an assignment
当一个流程执行到某种状态时候,工作流引擎将会等到一个外部的trigger (通过调用jbpm 的api ,ExecutionService.endOfState(…) )。在这个方法里面,jbpm 将会算出流程实例的下一个状态。
所以一个状态能够依赖于一个外部参与者。外部参与者可以是一个人也可以是某个系统。有许多种方式来实现业务流程中的状态与任务相关联。这些任务基本上可以分为两组:
1、 基于客户端的委派
在这种策略中,jbpm 的用户管理他们自己用户的任务列表。在这种情况,jbpm 只是用一个执行引擎来控管有限状态机。Jbpm 的职责是计算并且追踪过程执行中的状态,然而客户端的职责就是确保每个人知道做了什么。然后客户端一般就是在一个给定的状态中找到过程实例(或者说tokens )
2、 基于流程的委派
(在jbpm2.0 beta3 之前支持这种委派策略)
在这种委派策略中,jbpm 将会担负给参与者安排状态并且追踪任务列表的职责。在jbpm 中,流程在执行过程中是以一个token 来进行跟踪的。一个token 有一个指针来指向状态和一个参与者。在jbpm 中一个参与者总是引用java.lant.string 。为了详细说明jbpm 如何必须安排tokens 给参与者们,一些事件与此相关。接下来一个一个介绍:
只要一个客户端启动一个过程实例或者发出结束状态的信号,jbpm 都会计算过程实例的下一个状态。
首要的事情是关于这些api 方法中的第一个参数:参与者。这个参与用来识别谁来执行。
在启动一个新的过程实例的情况下,一个root-token 在开始状态中被创建好。在结束一个状态的情况下,一个tokenid 需要以一个某种状态中的参数形式指定。然后,jbpm 将会开始为token 计算下一个新状态。为了简单起见,我们忽略并发这种情况。Token 将会经历变迁和节点,然后抵达下一个状态节点。在那时,一个token 需要安排一个参与者。选择一个参与者之后,jbpm 将通过token 和调用的方法(开始过程实例或者结束状态)的返回值进行关联选择的参与者
所以当一个状态中的token 具备有一个参与者时,那就意味着过程实例的执行是在等待这个参与者提供一个外部trigger 给jbpm 引擎。在这种情形下,过程中的状态对应一个用户的任务,jbpm 通过检索所有已经安排给指定的参与者的tokens 计算任务列表。现在,参与者能够从列表中选择一个token 和发出结束状态信号量。
Assignmentn (委派)有许多属性:assignment 和authentication 。Assingement 属性可以有两个值:optional 和required 。Required 意思指当执行到某一个状态时,jbpm 将会检测是否把一个token 安排了一个参与者。如果非法则会抛出AssignmentException 的异常。如果assingment 是optional (=default ),当到达一个状态时jbpm 就允许离开一个未安排的token 。属性authentication 指定约束条件来限定哪个参与者可以发出结束状态的信号。参与者通过endOfState 方法中的参数actorid 来指定。如果optional=default 意思指对于指定谁来担当结束状态并不是必须的。Required 意味着一个参与者需要被指定。Vertify 意味着结束状态只可以安排给已经安排token 的参与者。
更多信息请查看群组委派。查看faqs 。
Swimlane
<!ELEMENT swimlane ( description?, delegation ? ) >
<!ATTLIST swimlane name CDATA #REQUIRED >
dtd fragment for swimlane
非常典型的情况,一个人具备一个流程中多个状态的职责。在 jbpm 中通过创建一个 swimlane 并且通过 swimlane 安排状态给参与者( actor )。一个业务流程中的 swimlane 可以被看做为一个针对参与者的角色名字。 Jbpm 对 swimlane 的解释与 UML1.5 中的术语 swimlane 解释一致。首次执行到达一个状态,给定一个 swimlane ,就会算出参与者。
public interface AssignmentHandler {
String selectActor( AssignmentContext assignerContext );
}
the AssignmentHandler interface
在 swimalne 中的 delegation 标签指向一个 AssignmentHandler 的具体实现。
然后那个参与者( actor )以 swimlane 中同名的方式被存储为过程变量。下次当一个 process archives 在一个状态,利用 swimlane , jbpm 引擎将会检测变量并且安排 token 给参与者(存储在变量中的)
计算的结果是存储一个 swimlane 同名的过程变量。所以当下一个状态到达相同的 swimlane 时,状态就会安排给相同的 actor ,而不再用 AssignmentHandler 。因为在 swimlane 和参与者之间的关联已经存储在变量中,而且可以通过更新变量来改变 swimlane 参与者( actor )之间的关联关系。
变量和类型:
<!ELEMENT type ( description?, (delegation |transient), variable* ) >
<!ATTLIST type java-type CDATA #IMPLIED >
<!ELEMENT transient EMPTY >
<!ELEMENT variable EMPTY >
<!ATTLIST variable name CDATA #REQUIRED >
dtd fragment for type and variable
一个是变量是一种key-value 对。它与过程实例(一次过程执行)相关联。Key 是java.lang.string ,value 是任何java 类型的任何pojo 。所以任何是java 类型,即使不给jbpm 知道也能被应用到变量中。
变量存储过程实例的上下文信息(context )。变量可以通过下面几种方式进行设置读取:
- ExecutionService.startProcessInstance( String actorId, Long definitionId, Map variables , String transitionName )
- ExecutionService.endOfState( String actorId, Long tokenId, Map variables , String transitionName )
- ExecutionService.setVariables( String actorId, Long tokenId, Map variables )
- ExecutionContext.setVariable( String name, Object value )
- ExecutionService.getVariables( String actorId, Long tokenId )
- ExecutionContext.getVariable( String name )
当设计变量时候,jbpm 尽量模仿java.util.map 的语义。这一点可以通过jbpm-api 来了解。也就是说一个变量只能当它被插入时被赋值,任何java 类型都可以作为变量中的value 。
一个type 描述jbpm 如何存储变量的值到数据库中。Jbpm 有一个文本域用来存储值,中间以serializer 来实现文本和对象之间的转换。
public interface Serializer {
String serialize( Object object );
Object deserialize( String text );
}
the Serializer interface
一个type 可以被看做一个serializer 的引用。Jbpm 包含了一些默认serializer 的实现,其中包括下面java 类型:
java.lang.String
java.lang.Long
java.lang.Double
by default supported java-types
变量类型匹配:
Java 类型声明的变量已经被默认支持,而不用在processdefinition.xml 声明。Jbpm 有个自动转换机制:当一个变量初始化后,jbpm 按照下面步骤,首先检测java 类型。如果它默认被java 支持,那么就可以正常使用,否则,jbpm 检查声明的类型是否与processdefinition.xml 中java-type 属性定义的变量是否一致。在匹配过程中jbpm 也考虑变量值的父类。如果没有找不到这种类型,jbpm 就把这样的变量作为transient (瞬间)变量对待。为了避免jbpm 不得不执行匹配过程,你可以把变量指定到它各自类型中去。
Transient (瞬间)变量:
一些变量并不需要做持久层处理存储在数据库中,jbpm 支持瞬时变量。这样的变量不存储到数据库中并且只可以在jbpm-api 的方法中使用。换句话说,瞬时变量的使用范围是:jbpm-api 的方法。
相关推荐
"jbpm-jpdl-designer-3.1.3.zip" 是一个压缩包,其中包含的是JBPMP项目中的JPDL设计器的相关资源。这个版本号3.1.3表明这是一个特定的历史版本。JBPMP(Java Business Process Management Suite)是用于业务流程管理...
jbpm-jpdl-designer-3.0.13 是一个与jbpm相关的软件包,主要功能是提供jbpm流程定义的图形化设计工具。...通过深入学习和使用jbpm-jpdl-designer,开发人员和业务分析师可以更好地理解和管理复杂的企业级流程。
在"jbpm-jpdl-javadoc"中,"javadoc"是Java开发工具包提供的一个工具,用于生成关于Java源代码的API文档。这个压缩包文件"javadoc-jpdl"包含了jbpm中JPDL相关的API文档,这些文档详细解释了JPDL库的各种类、接口、...
在jbpm-jpdl-src.rar这个压缩包中,我们可以找到jBPM 3.2.2版本的源代码,这对于学习和理解jBPM的工作原理以及如何自定义流程非常有帮助。 在这个源码包中,"org"目录很可能是项目的核心组件,包含了以下关键部分:...
入门材料 jbpm-jpdl 学习笔记 jbpm-jpdl 学习笔记 jbpm-jpdl 学习笔记
在开始jBPM-jPDL的学习之前,首先要搭建一个合适的运行环境。系统平台通常要求Java运行环境(JRE或JDK),因为jBPM是基于Java的。安装包通常包括jBPM的核心库、示例项目以及相关的开发工具。对于部署,可以将jBPM...
jPDL-identity.jar是jBPM的轻量级扩展,实现了基础的用户认证和权限管理功能,适用于需求简单的应用场景。另外,jBPM Console是一个基于JSF技术的Web应用程序,用于监控jPDL平台的执行情况,包括数据库监控、流程...
下面,我们将通过学习笔记,了解jBPM-jPDL的流程设计与控制机制。 流程设计 在jBPM-jPDL中,流程设计是指定义业务流程的结构和行为。流程设计通常包括定义流程的各个节点、 переход和操作。jPDL(Java ...
《jBPM-jPDL学习笔记——流程设计与控制》 在IT行业中,流程管理和自动化是企业提升效率的关键。jBPM(Java Business Process Management)是一个开源的工作流和业务流程管理套件,它允许开发者通过定义流程定义...
1. **流程定义(Process Definition)**: jPDL通过一系列节点(如任务、事件、决策等)描述一个流程。流程定义可以包含多个泳道,每个泳道代表不同的参与者或角色。 2. **节点(Nodes)**: 节点是流程中的基本元素...
根据提供的文件信息,我们可以深入探讨jbpm jpdl帮助文档中的关键知识点。该文档主要围绕jBPM(一款开源的工作流引擎)以及其图形化...通过这些内容的学习,可以帮助读者更好地理解和掌握jBPM和jpdl的相关技术细节。
**JBoss、jBPM与jPDL:工作流管理的...通过这份开发手册,开发者可以系统地学习并掌握jBPM和jPDL,从而在实际项目中有效地实现业务流程的自动化和管理。这不仅提升了开发效率,也为企业的业务流程优化提供了强大支持。
总之,《JBoss jBPM jPDL用户开发手册1.1》是一份详细的学习指南,涵盖了jBPM和jPDL的使用方法和最佳实践,对于希望深入了解和使用jBPM进行业务流程管理的开发者来说,是一份宝贵的参考资料。通过阅读这本手册,你...
1. **解析JPDL文件**:首先,你需要阅读并解析JPDL文件,理解其中的各个元素和它们之间的关系。例如,`<process>`元素代表整个流程,而`<swimlane>`元素定义了流程中的参与者或角色。 2. **识别节点和转换**:在...
2. **jBPM流程模型**:理解BPMN 2.0符号,学习如何使用jPDL创建流程模型,包括任务、事件、网关和泳道等元素。 3. **流程部署**:了解如何将jPDL流程定义文件部署到JBoss服务器,以及如何在运行时启动和监控流程...
在第8章中,我们将会深入学习如何使用jPDL来创建和管理复杂的业务流程。 1. **任务(Tasks)** 在jPDL中,任务是流程的基本构建块,代表了流程中的一个操作或活动。你可以定义任务的类型、执行者、相关数据以及...
- 解压缩下载的`jbpm-jpdl-designer-site.zip`文件。 - 将解压后的`features`和`plugins`文件夹中的所有文件复制到MyEclipse安装目录下的相应文件夹。 - 重启MyEclipse,此时插件已安装完成。 3. **MyEclipse...