现在的位置: 首页 > 综合 > 正文

jbpm用户指南翻译:第16章 jBPM流程定义语言(JPDL)

2013年12月22日 ⁄ 综合 ⁄ 共 6146字 ⁄ 字号 评论关闭
 

第16章 jBPM流程定义语言(JPDL)
JPDL指定了xml模式和打包所有流程定义相关文件到一个流程档案的机制。
16.1 流程档案
一个流程档案就是一个zip文件,流程档案中的核心文件是processdefinition.xml,该文件的主要信息是流程图,processdefinition.xml文件还包括有关动作和任务的信息。流程档案也可以包含其他流程相关文件,如classes(类的字节码文件)、任务的ui-forms(任务的用户界面窗体)、…
16.1.1 部署流程档案
可以用3种方式部署流程档案:用流程设计器工具,用ant任务或编程。
使用设计器工具部署流程档案仍然在构建阶段。
使用ant任务部署流程档案可以按照如下方式:
<target name="deploy.par">
 <taskdef name="deploypar" classname="org.jbpm.ant.DeployParTask">
    <classpath --make sure the jbpm-[version].jar is in this classpath--/> 
 </taskdef> 
 <deploypar par="build/myprocess.par" />
</target>
要一次部署多个流程档案,可以使用嵌套的fileset元素,file属性是可选的。Ant任务的其他属性是:
l        cfg:cfg是可选的,默认值是“hibernate.cfg.xml”,hibernate配置文件包含jdbc连接数据库的属性以及映射文件。
l        properties:properties是可选的,并且覆盖所有hibernate.cfg.xml文件中的hibernate相同属性。
l        createschema:如果设置为true,则jbpm数据库模式(数据表)在流程部署前被创建。
流程档案还可以通过使用类org.jbpm.jpdl.par.ProcessArchiveDeployer编程被部署。
16.1.2 流程版本
流程定义不应该改变,因为预测流程变化带来的所有可能的影响是非常困难的(或者说是不可能的)。
围绕这个问题,jBPM有一个明智的流程版本机制。版本机制允许在数据库中多个同名流程定义共存,流程实例以当时的最新版本来启动,并且在它的整个生命周期中将保持以相同的流程定义执行。当一个新的版本被部署,新的流程实例以新版本启动,而老的流程实例则以老的流程定义继续执行。
流程定义是指定的流程图以及其他一组相关的java classes(字节码文件)的结合体,有两种方式可以使java classes在jBPM运行环境是可用的:确保这些java classes对于jBPM类装载器是可见的,这通常意味着你可以把委托classes放入一个.jar文件,然后再放入jbpm-[version].jar文件;另外,java classes也可以被包含在流程档案中,当在流程档案中包含自己的委托classes时(它们不被jbpm类装载器可见),jBPM也将在这些classes上应用版本机制。有关流程类装载的更多信息可以在“16.2委托”中找到。
当一个流程档案被部署时,将在jBPM数据库中创建一个流程定义,流程定义基于流程定义的名称被版本化。当一个被命名的流程档案被部署,部署器将分配一个版本号。为了分配版本号,部署器将查询同名流程定义的最高版本号,并且在其上加1,未命名的流程定义其版本号总是-1。
16.1.3 改变已部署的流程定义
在部署到jBPM数据库之后改变流程定义有很多潜在的缺陷,因此非常不鼓励这样做。
事实上,对于流程定义会有很多可能的改变,这些流程定义中的某些也许是无害的,但是改变意味着会更合理。
因此请考虑通过这种途径移植流程实例到新的定义。
如果你打算这么做,下面是需要考虑的点:
使用hibernate的更新:你可以加载一个流程定义,改变它并且使用hibernate session保存它。Hibernate session可以用JbpmContext.getSession()方法获取。
二级缓存:在你更新一个存在的流程定义之后,该流程定义需要从二级缓存中移除,请参看“第7.10二级缓存”。
16.1.4 移植流程实例
改变流程定义可能会要求转换执行(正在执行的流程实例)到一个新的流程定义,由于业务流程的持续性,考虑到这不是没有价值的。当前,这还是一个实验区域,还没有在支持范围之内。
就象你所了解的那样,流程定义数据、流程实例数据(运行时数据)、以及日志数据有明显的区别。使用这种方式,在jBPM数据库中创建一个独立的新的流程定义(例如,可以部署一个相同流程的新的版本),然后运行时信息被转换到新的流程定义。这可能包括导致一个旧流程指向的节点在新流程中已被移除的转化,因此,仅仅新的数据才在数据库中被创建,但是这样一个流程执行被遍布在两个流程实例对象上,这可能会成为工具和统计计算中棘手的部分。当资源允许时,我们将在以后做支持,例如,流程实例上会添加一个指向其前一个实例的指针。
16.1.5 流程变换
一个转换类用来帮助你把jBPM2.0流程档案转换到jBPM3.0兼容的流程档案。创建一个用来放置转换后流程档案的输出目录,从jBPM3.0分发的构建目录键入下面命令行:
java –jar converter.jar 输入目录 输出目录
用你的jBPM2.0流程档案位置替换“输入目录”,用创建的放置新的转换后流程档案的目录替换“输出目录”。
16.2 委托
委托是用来在流程执行中包含用户自定义代码的机制。
16.2.1 jBPM类装载器
jBPM类装载器是装载jBPM类的装载器,这意味着jbpm-3.x.jar库在类装载器的classpath中。要使类对于jBPM类装载器可见,就把它们放入一个jar文件,并把这个jar文件放入jbpm-3.x.jar,或者放入web应用的WEB-INF/lib文件夹下。
16.2.2 流程类装载器
委托类由它们各自流程定义的流程类装载器来装载,流程类装载器是以jBPM类装载器为父的类装载器。流程类装载器添加某个流程定义的所有类,你可以通过把类放入流程档案的/classes文件夹而把类添加到流程定义。注意,这仅仅当你想要把所添加的类版本化时才有用。
如果版本化不是必须的,则使类对于jBPM类装载器可见效率会更高。
16.2.3 委托配置
委托类包含在流程执行中将被调用的用户代码,最一般的例子就是动作(action),在这种情况下,ActionHandler接口的一个实现在流程事件上被调用。委托在processdefinition.xml中被指定,当指定一个委托时可以提供3部分的数据:
l        类名(必需的):委托类的完整类名。
l        配置类型(可选的):指定实例化和配置委托类对象的方式。默认情况下,默认的构造器被使用并且配置信息被忽略。
l        配置(可选的):按照配置类型所要求格式对委托对象的配置信息。
下面是所有配置类型的描述:
16.2.3.1配置类型field
这是默认的配置类型,配置类型field将首先实例化一个委托类的对象,然后按照配置中的指定将值设置到对象的成员(field)中。配置是xml格式的,其元素与类的成员名称一致,元素的内容文本被放入相应的成员。如果是必需且可能的,则元素的内容文本被转换为成员类型。
所支持的类型转换:
l        String当然不需要转换,但是它会被修整(trim)。
l        原始类型,例如int、long、float、double、…
l        原始类型的基本包装类。
l        列表(list)、集合(set)、以及聚集(collection)。这种情况下,xml内容的每个元素被看作聚集的一个元素,并且在转换中被递归的解析。如果元素类型与java.lang.String不同,则需要通过为类型属性指定一个完整类型名来标出。例如,下面片断将把一个字符串的ArrayList注入成员“numbers”:
<numbers>
 <element>one</element>
 <element>two</element>
 <element>three</element>
</numbers>
元素中的文本可以被转换为任何拥有一个String构造器的对象,要使用String类型之外的其他类型,则在成员元素(本例中的“numbers”)中指定element-type。
下面是另外一个map的例子:
<numbers>
 <entry><key>one</key><value>1</value></entry>
 <entry><key>two</key><value>2</value></entry>
 <entry><key>three</key><value>3</value></entry>
</numbers>
l        maps。这种情况,每个成员元素需要有一个子元素key和一个元素value。key和value都被递归的使用转换规则解析,与聚集(collection)完全一样,如果没有类型属性被指定,则假定转换到java.lang.String。
l        org.dom4j.Element
l        其他类型,字符串构造器被使用。
例如下面的类…
public class MyAction implements ActionHandler {
 // access specifiers can be private, default, protected or public
 private String city;
 Integer rounds;
 ...
}
…下面是有效的配置:
...
<action class="org.test.MyAction">
 <city>Atlanta</city>
 <rounds>5</rounds>
</action>
...
 
16.2.3.2配置类型bean
与field配置类型相似,除了属性被通过setter方法设置之外,而不是直接设置到成员上,使用相同的转换规则。
16.2.3.3配置类型constructor
这种实例化会取委托的xml元素的所有内容,并且把它们作为文本传入委托类的构造器。
16.2.3.4配置类型configuration-property
首先,使用默认的构造器,然后这种实例化将取出委托xml元素的所有内容,并且把它们作为文本传入方法void configure(String)。(就像jBPM2中一样)
16.3 表达式
对于某些委托,支持一种象JSP/JSF EL那样的表达式语言。在动作(actions)、分配(assignments)和决策(decision)条件中,你可以写一个如expression=“#{myVar.handler[assignments].assign}”的表达式。
这种表达式语言的基础知识可以在J2EE指南中找到。
jPDL表达式语言与JSF表达式语言相似,jPDL EL基于JSP EL,除了使用#{…}符号以及它包括对方法绑定的支持之外。
依赖于上下文,流程变量或者任务实例变量连同下面的内置对象可以被作为变量使用:
l        taskInstance(org.jbpm.taskmgmt.exe.TaskInstance)
l        processInstance(org.jbpm.graph.exe.ProcessInstance)
l        token(org.jbpm.graph.exe.Token)
l        taskMgmtInstance(org.jbpm.taskmgmt.exe.TaskMgmtInstance)
l        contextInstance(org.jbpm.context.exe.ContextInstance)
这个特性在Jboss SEAM环境中变得真正强大,因为jBPM与Jboss SEAM的集成,所有你自己的bean、EJB和其他某种素材在你的流程定义中变得直接可用。
16.4 jBPM XML 模式
jPDL模式是流程档案里的processdefinition.xml文件中所使用的模式。
16.4.1 确认
在解析一个jPDL XML文件时,当遇到两种情形时jBPM将靠jPDL模式验证你的文档:第一种,模式在XML文件中被引用,如下
<process-definition xmlns="urn:jbpm.org:jpdl-3.1">
 ...
</process-definition>
第二种,xerces解析器被放置在了classpath。
jPDL模式可以在${jbpm.home}/src/java.jbpm/org/jbpm/jpdl/xml/jpdl-3.1.xsd或http://jbpm.org/jpdl-3.1.xsd中找到。
16.4.2 process-definition
表格 16.1
名称
类型
多样性
描述
name
属性
可选的
流程的名称。
元素
[0..*]
流程中使用的泳道。泳道表示流程角色,它们被用于任务分配。
元素
[0..1]
流程起始状态。注意,没有起始状态的流程是合法的,但是不能被执行。
元素
[0..*]
流程定义的节点。注意,没有节点的流程是合法的,但是不能被执行。
元素
[0..*]
作为一个容器服务于动作的流程事件。
元素
[0..*]
全局定义的的动作,可以在事件和转换中引用。注意,为了被引用,这些动作必须指定名称。
元素
[0..*]
全局定义的任务,可以在动作中使用。
元素
[0..*]
一个异常处理器列表,用于这个流程定义中的委托类所抛出的所有异常。
 
16.4.3 node
表格 16.2
名称
类型
多样性
描述
事件
1
用于表示这个节点行为的定制动作。
 
 
请参考普通节点元素
 
16.4.4 普通节点元素
表格 16.3
名称
类型
多样性
描述
name
属性
必需的
节点的名称。
async
属性
{true|false},默认是false
如果设置为true,这个节点将会异步执行。请参考“13章异步继续”。
元素
[0..*]
离开转换。每个离开节点的转换必须有一个不同的名称,最多只允许所有离开转换中的一个没有名称。第一个转换被指定为默认转换,当离开节点而没有指定转换时,默认转换发生。
元素
[0..*]
支持的事件类型:{node-enter|node-leave}。
元素
[0..*]
一个异常处理器列表,用于这个流程节点中的委托类所抛出的所有异常。

抱歉!评论已关闭.