jbpm学习
来源:互联网 发布:淘宝产品主图素材 编辑:程序博客网 时间:2024/05/21 19:22
jBPM(JBoss Business Process Management业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。
jPDL是构建于jBPM框架上的流程语言之一。在jPDL中提供了任务(tasks)、待处理状态(wait states)、计时器(timers)、自动处理(automated actions)…等术语,并通过图型化的流程定义,很直观地描述业务流程。
jPDL可以部署于Java语言的任何应用环境下,JavaSE Application(Swing/SWT)、JavaEE Application(Application Server)
jPDL分发包组成
目前jPDL的最新版本是3.2.2,您可以在以下地址:http://labs.jboss.com/jbossjbpm/jpdl_downloads/
获得官方下载包。下载包分为两种,一种是标准包(jbpm-jpdl-3.2.2.zip)只有20M左右;一种是套件包(jbpm-jpdl-suite-3.2.2.zip)将近80M。两者最大的区别是套装包自带一个已经配置好的jboss服务,下载解压缩后,可直接运行。
jPDL的核心程序包(jbpm-jpdl.jar)
它是一个典型的jar文件,它涵盖对流程定义和运行时流程实例上下文环境的操作API。在最简化的业务流程样例中,jPDL将流程定义存储与XML格式的定义文件中,在运行时载入内存,在内存里记录完整的业务实例和执行过程的环境变量,并完成全部操作。显然,在实际应用中,流程信息必须被持久化的存储于数据库中。jPDL使用了Hibernate作为其对象持久化的API。
Graphical Process Designer插件(jbpm-jpdl-designer-3.1.2.zip)
它是一个基于Eclipse的图型编辑插件。使用它可以对业务流程进行可视化的定制,而无须手动编辑XML文件。该插件还提供了流程定义上传功能,可以将新定义的流程发布到在线运行的jPDL系统上。
jPDL身份包(jbpm-identity.jar)
它是jPDL的一个轻量级扩展包,简单实现了组Group、用户User、许可权Permission等用户身份认证和鉴权机制。如果您的应用环境只需要简单的用户认证鉴权管理,那么它十分适合您。
jPDL Web控制台(jbpm-console.war)
它是一个标准Web应用(使用了JSF技术),提供了对jPDL平台执行情况的监控程序(对jPDL数据库的监控)。管理员可以通过该程序方便的维护jPDL的数据库,管理流程定义和流程实例的执行情况。同时,它还提供了一个简单的Getting started DEMO,方便初学者了解jPDL。
其他相关目录
在解压后的目录中,还有一些文件是很有用的
/config 该目录存放了jPDL的默认配置文件 ,包括hibernate.cfg.xml 、jbpm.cfg.xml(jPDL的主配置文件,默认是空的)、jbpm.mail.templates.xml(邮件模板配置文件)、log4j.properties(日志配置文件)
/db 该目录存放了jPDL针对不同数据库的表初始化sql文件。这里要说的是,jbpm.jpdl.mysql.sql在MySql下批量运行时,会出现错误提示,原因是语句后缺少”;”号,需要修订后才能使用。
/ designer(套件包中才有) 该目录存放了Graphical Process Designer插件
/examples 该目录存放了jPDL的简单范例
/doc 该目录存放jPDL 的相关说明文档,包括用户指南、Java API文档等
/server (套件包中才有) 该目录存放了配置好的jBoss和控制台程序,Windows下双击start.bat可立即执行。数据库使用HSQL,存放于/server/server/jbpm/data下。
jPDL业务流程模型
理解现实生活中的业务流程
下面我们通过一个简单的部门借款流程来了解现实中的业务流程概念,流程图如下:
上图表达了一个抽象的流程定义(Process Definition)。之所以称之为抽象,是因为它没有表示确切的执行者。当上述的借款人被具体化为“张三”,部门主管就成为张三的部门经理“李四”,而财务则明确为“王五”的时候,这个流程定义就被具体化,成为了一个流程实例(Process Instance)。此外,过程中的相关人员我们称之为参与者(Actor);过程中需要参与者介入的环节称之为任务(Task);每个任务在流程实例中的具体化称之为任务实例(Task Instance);从一个任务(结点)到另一个任务(结点)的转化过程叫做流转(Transition);而在流程中,由程序预先设定的行为如发送邮件,我们称之为活动(Action)。 通过上述样例,我们了解了业务流程中一些专有名词和概念。接下来,我们要从程序设计的角度来讲述jPDL中定义的流程对象模型。
在jPDL中,对流程的建模被划分为两大部分,一是针对“流程定义”的静态模型部分;二是针对具体“流程实例”的运行时动态模型。在这一章节,我们将详细的讲述jPDL的对象及对应的数据库设计。
静态的流程定义模型
编号PD-001对象流程定义实体(Process Definition)描述流程定义实体是对一个流程抽象的对象化定义,如图-002。一套系统中,用户可以定义保存多个流程定义实体,如:报销流程定义、请假流程定义、人事录用流程定义等。每个流程定义还可以有多个不同的版本,如:针对同样的报销流程可以有修订前和修订后的两个流程定义,同时存储于jPDL数库中。用户可以通过流程名称和版本号获取相应的流程定义。在默认请况下,系统启用最新的流程定义。Java对象org.jbpm.graph.def.ProcessDefinition数据库表JBPM_PROCESSDEFINITION该表存储流程定义的通用信息,如:流程名称、版本号表关联说明JBPM_PROCESSDEFINITION表中,每条记录有自己的数据库流水号ID_JBPM_PROCESSDEFINITION的外键(Foreign Keys):
- startstate_ 同JBPM_NODE(流程结点)表关联。此外键指向流程定义中的起始结点ID
ID_JBPM_NODE的外键(Foreign Keys):
- processdefinition_ - 此外键说明该Node从属的流程定义对象ID
- subprocessdefinition_- 此外键指定了一个由该Node发起的子流程。在主流程离开当前结点之前,该子流程必须完成执行过程。action_ - 此外键指定该结点动作类的ID
- superstate_ - 该外键是一个自关联键,指向结点的上级父结点ID。一个子流程中的多个结点从属于同一个父流程结点。
- decisiondelegation_ – 该外键指定了结点委派的判定类ID(所谓委派判定类是指根据用户的业务逻辑,判定流程的下一个流向的Java Class)
Node类型祥解:
任务结点(task-node)任务结点是代表由人介入的一个或多个任务。因此当流程运行到一个任务结点时,会生成“任务实例对象(task instances)”,并添加到参与人的任务列表中,之后结点会处于等待状态,直到参与人完成他们的任务,并激活流程继续向下执行。
状态结点(state)
状态结点是一个典型的等待状态。同任务结点不同的是,状态结点不会向任务列表添加任务实例。当业务进程需要等待外部系统的干预时,这种结点是很有用的。假设如下情况:在进入该结点时,通过 node-enter事件向外部系统发送一个消息,然后结点进入等待状态;当外部系统完成处理,并回送一个消息,这将导致触发一个 token.signal()方法的运行,该方法重新激活正在等待的流程继续下行。
判定结点(decision)判定节点的作用就同它的命名一样,用来决定业务流程的走向。有两个不同裁决模式,两者的区别在“谁”来做决定:是由流程内部的变量,还是由外部实体来提供决定的依据。当需要对流程执行方向做判定时,就要使用“判定结点(decision)”。有两种方法来指定判定条件。最简单的是在转向(transitions)中添加条件元素,条件可以是能返回boolean值的EL表达式或者beanshell脚本。在运行过程中,判定结点将首先轮训有条件设定的转向(leaving transitions),轮训的顺序是按照XML文件中指定的。当找到第一个条件返回为true的转向时,该出口将被选中。如果所有的表换中的条件判定都是false,则选择XML文件中排在第一位的转向作为出口。还有一种途径是在判定结点上定义一个返回转向名称的表达式,通过表达式计算返回的名称,决定选择哪个transition.另一方式是在结点上设定“处理(handle)”元素。在结点上指定一个实现了DecisionHandler接口的 Java处理类,该类通过返回选定的transition的名称来决定流程的出口方向。
当判定结点的出口是由外部程序来给出的时候,建议使用多个transition或者具有等待状态的结点。可以通过外部的触发器结束一个等待状态并提供一个transition的判定。
分支结点(fork)
分支结点的作用是将单个执行流程分裂成多个并发的执行流程。默认的行为是为每个子流程生成一个子令牌,并建立子令牌和主流程根令牌之间的父子关系。
合并结点(join)
相对于fork结点的分支,join结点将分支收拢。默认的行为模式是当所有的分支(由同一个fork衍生出来的分支)都到达该结点的时候,join结点将结束这些分支上的子 token,并通过token上的父子关系找到上一级流程的token,将此token通过唯一的transition传播下去。如果只有分支中的部分 token到达时,join结点将处于等待状态。
普通结点(node)普通类结点主要用于提供用户定制自己的程序代码。普通结点拥有一个action子元素,当流程到达该结点时,这个action就会被执行。可以通过实现ActionHandler接口来执行你想要的任何代码。此外普通结点也一样要负责流程的延续。
在流程图上,普通结点用来表达一个用户关心的、与业务相关的处理逻辑;相比而言Action(下文中将会提到)则允许添加业务逻辑以外的程序处理,这些程序处理在流程图上是不可见的,也是业务流程分析所不用关心的。
编号PD-003对象流程转向(Transitions)描述流程转向是描述流程中从一个结点到另一个结点的状态转换过程,因此一个转向一定有一个源结点和一个目标结点。 在jPDL中transition的命名是通产是唯一的,结点依靠transition的命名来区别到下一结点的路径,当一个Node中存在有多个同名的 transition的时候,第一个transition将会被选中。结点转向的过程中,排在transition列表第一位置的即是默认的 transition。Java对象org.jbpm.graph.def.Transition数据库表JBPM_TRANSITION该表存储流程定义中的转向对象。 表关联说明JBPM_TRANSITION表中,每条记录有自己的数据库流水号
ID_JBPM_TRANSITION的外键(Foreign Keys):
- processdefinition_ - 该外键指向transition所属的流程定义对象ID
- from_ - 该外键指向transition的源结点ID
- to_ -该外键指向transition的目标结点ID
JBPM_ACTION的外键(Foreign Keys):
- processdefinition_ - 指明action所属的流程定义ID
- event_ - 指明action绑定的event ID
- actiondelegation_ - 指明action的委派对象ID
- exceptionhandler_ - 指定action的异常处理ID
- referencedaction_ - 指向当前action引用的action的ID
- timeraction_ - 指向当前action引用的计时器action
- JBPM_EVENT的外键(Foreign Keys):
- processdefinition_ - 指向event所属的流程定义ID
- node_ - 指向event所属的node ID
- transition_ - 指向event所属的transition ID
- task_ - 指向event所属的任务ID
编号PD-006对象任务(Task)描述任务作为流程定义中的一部分,定义了如何创建任务实例(Task instances)以及任务分配。任务可以在任务结点(Task-Node)和流程定义(process-definition)两个地方定义。通常会在一个任务结点中定义一个或多个的任务。在这种情况下,任务结点表示在流程中等待用户处理的交互操作。业务流程会停留在任务处,等待用户完成相应的操作之后继续。任务也可在流程定义中声明。通过任务名,可以找到相应的任务定义,并引用他们。实际上任何有命名的任务都可以通过名字被引用。在整个的流程定义中,任务名必须是唯一的。此外,还可以给任务设定优先级,这些优先级属性将成为任务实例化时的默认设置。任务实例可以在之后的运行中改变优先级。.Java对象org.jbpm.taskmgmt.def.Task数据库表JBPM_TASK该表存储流程定义中声明的任务对象。表关联说明JBPM_TASK表中,每条记录有自己的数据库流水号ID_
JBPM_TASK的外键(Foreign Keys):
- processdefinition_ -指向task所属的流程定义ID
- taskmgmtdefinition_ - 指向task引用的TaskMgmtDefintion对象ID
- tasknode_ - 指向task所属的任务结点ID
- startstate_ -指向task所属流程的起始结点ID
- assignmentdelegation_ - 指定task委派处理的class对象的ID
- swimlane_ - 指定task要授权的swimlane(角色)ID
- taskcontroller_ - 指定一个task赋值的委托类
上述我们剖析了jPDL业务流程定义中最重要的几个静态对象,说明了它们的概念、作用、行为特征及关联关系。在正式的运行环境中,这些对象定义被jPDL持久化于数据库中,当用户发起一个业务流程时,被系统实例化。在下面的小节中,我们要讲述流程被实例化后的数据模型。
具体化的流程实例模型
本章节介绍流程实例中最重要的三个对象:流程实例(Process Instance)、令牌(Token)、任务实例(Task Instance).
编号PI-001对象流程实例(Process Instance)描述流程实例是流程定义的运行时状态,它记录了一个流程运行的起始时间、结束时间等状态信息Java对象org.jbpm.graph.exe.ProcessInstance数据库表JBPM_PROCESSINSTANCE该表存储运行时的流程对象信息。表关联说明JBPM_PROCESSINSTANCE表中,每条记录有自己的数据库流水号
ID_JBPM_PROCESSINSTANCE的外键(Foreign Keys):
- processdefinition_ - 该流程实例对应的流程定义的ID
- roottoken_ - 该流程实例引用的跟令牌
- superprocesstoken_ - 如果当前流程是某个流程实例的子流程,则指向该父流程的ID
JBPM_TOKEN的外键(Foreign Keys):
- processinstance_ - 指向该令牌所属的流程实例的ID。
- subprocessinstance_ - 指向该令牌所属的子流程实例ID。
- node_ - 令牌所在(所指向的)的当前节点ID.
- parent_ - 如果当前令牌是一个分支流程或子流程的令牌,则该值指向其父令牌ID。
JBPM_ TASKINSTANCE的外键(Foreign Keys):
- task_ - 指向定义该实例的任务ID
- token_ - 指向任务实例对应的令牌ID
- swimlaneinstatnce_ - swimlane 实例,表示处理该任务的角色
- taskmgmtinstance_ - 管理该任务的模块实例ID
jPDL语言主要XML元素大纲
本章节将介绍jPDL语言中,主要几个XML元素的属性及相关描述。
<process-definition>(流程定义)
名称类型多样性描述name属性可选流程的名称swimlane元素[0..*]在流程中使用的swimlanes 。 swimlanes是过程中的用户角色,可以用于任务的委派分配 start-state元素[0..1]流程的起始状态结点{end-state|state|node| task-node|process-state| super-state|fork|join|decision}元素[0..*]流程定义中出现的各类结点event元素[0..*]流程中的事件,可看成是action的容器{action|script|create-timer |cancel-timer}元素[0..*]全局定义的action,可以在 events和transitions中通过命名引用task元素[0..*]全局定义的task,可以在action中使用命名来引用.exception-handler元素[0..*]异常处理类,用来处理委派类抛出的异常.<node>(节点)
名称类型多样性描述{action|script|create-timer |cancel-timer}元素1定制的结点动作common node elements 参考common node elements<common node elements>(通用结点元素)
名称类型多样性描述name属性必须结点名称async属性{ true | false }, false is the default设置成true,则结点以异步方式运行transition元素[0..*]离开结点的转向.每个转向必须有一个可区别的名字。最多只允许一个转向是没有命名。第一个转向指定为默认的转向,当没有给结点指定转向时,将使用默认转向。event元素[0..*]支持的事件类型(node-enter | node-leave)exception-handler元素[0..*]针对委派类抛出异常的处理timer元素[0..*]指定一个计数器监视结点上的执行过程<start-state>(起始状态结点)
名称类型多样性描述name属性可选起始结点名称task元素[0..1]此任务会创建一个流程实例或者捕获流程的初始化者event元素[0..*]支持结点的事件:{node-leave}transition元素[0..*]流程转向,必须有唯一命名exception-handler元素[0..*]对委派类异常的处理者<end-state>(终止状态结点)
名称类型多样性描述name属性必须终止结点名称event元素[0..*]支持的结点事件:{node-enter}exception-handler元素[0..*]对委派类异常的处理者<task-node>(任务结点)
名称类型多样性描述signal属性可选值类型有:{unsynchronized|never|first|first-wait|last|last-wait}, 默认为last. 该属性定义了任务完成对流程延续的效果。create-tasks属性可选值类型有:{yes|no|true|false},默认值为true,也可以设置为false。用户可以在结点的node-enter事件中定义自己action,由action来生成任务,并且将此属性设置为false。end-tasks属性可选值类型有:{yes|no|true|false},默认值为false. 当设置为true的时候,所有未结束任务在node-leave 事件中会被关闭。task属性[0..*]当流程执行到当前结点时,将生成任务列表中的任务。common node elements 参考common node elements<fork>(分叉)
名称类型多样性描述common node elements 参考 common node elements<join>(合并)
名称类型多样性描述common node elements 参考 common node elements<decision>(判定结点)
名称类型多样性描述handler元素handler或者transition conditions二者必选其一实现org.jbpm.jpdl.Def.DecisionHandler接口的Java类名 transition conditions handler或者transition conditions二者必选其一判定结点将按顺序遍历每个leaving transitions中的条件判定。找到的第一个判定为true的leaving transitions将被选中。如果所有leaving transitions中的判定均为false,则选择第一个默认的leaving transitions.common node elements See common node elements<event>(事件)
名称类型多样性描述type属性必须事件的类型表明事件在元素中发生的位置。{action|script| create-timer|cancel-timer}元素[0..*]与事件绑定的动作列表。<transition>(转向)
名称类型多样性描述name属性可选转向的名称,每个转向必须有一个可区分的名字。to属性required目标节点的带层次的名称。如:phase one/invitemurphycondition属性/元素optional条件表达式或条件属性 {action|script| create-timer| cancel-timer}元素[0..*]进行转向时执行的动作。动作不需要放置于事件中,因为在转向(transition)中只有一个地方可以运行动作。exception-handler元素[0..*]对委派类异常的处理者
<action>(动作)
名称类型多样性描述name属性可选动作的名称。当动作被赋予名称的时候,它可以从流程定义中查找获取。这对运行时action和action的一次性声明是很有用的。class属性此属性同 ref-name 属性及expression属性,三者只能选其一实现了org.jbpm.graph.def.ActionHandler 接口的Java类名 ref-name属性此属性同 class 属性及expression属性,三者只能选其一所引用的action的名称。当该属性被指定的时候,action标签中的内容将被忽略。expression属性此属性同 class 属性及ref-name属性,三者只能选其一jPDL表达式,代替相应的处理方法。accept-propagated-events属性可选可选值:{yes|no|true|false}.默认值为 yes | true. 是否接受来至action绑定元素的子元素提交的触发事件。设为false | no,表示只接受action绑定的元素自身的事件config-type属性可选对ActionHandler实现类的初始化方式,可选值有:{field|bean|constructor|configuration-property}.async属性true |false默认为false,它意味着action与流程在同一线程中执行。如果设为true,将向命令执行器发送一则消息,并且action会以异步的方式在分离的事务(另一线程)中处理。 {内容}optionalaction标签体中的内容,作为初始化参数用来初始化ActionHandler的实现类.
<variable>(变量)
名称类型多样性描述name属性必须过程变量名access属性可选访问约束。可选值为:read, write and required. 默认是read, write该属性使用逗号分隔访问修饰列表。mapped-name属性可选变量映射名,默认同变量名。<handler>(处理器)
名称类型多样性描述expression属性此属性同class属性互斥jPDL表达式。该表达式返回字符串结果,与leaving transitions的命名相匹配class属性此属性同expression属性互斥实现接口org.jbpm.graph.node.DecisionHandler的Java类的完整类名. config-type属性可选对DecisionHandler实现类的初始化方式,可选值有:{field|bean|constructor|configuration-property}. {内容}可选handler标签体中的内容,作为初始化参数用来初始化DecisionHandler的实现类.
<task>(任务)
名称类型多样性描述name属性可选task的名称。该名称可以被查找和引用task对象。blocking属性可选可选值为:{yes|no|true|false}, 默认值为false.如果该属性被设置为true,则在没有完成任务前,流程不能离开此结点如果是true,那么token对象的signal方法将促使流程向下继续。大多情况下,强制中断流程会有客户操作界面发起。signalling属性可选可选值为:{yes|no|true|false}, 默认值为true.如果设置为false,则任务将失去触发流程继续下行的能力。duedate属性可选任务的持续时间。可以用绝对时间或工作日两种计量方式表示。swimlane属性可选对swimlane的引用.当一个swimlane 被赋予任务的时候, assignment属性将被忽略。priority属性可选优先级。可选值:{highest, high, normal, low, lowest}. 另一种表达方式可以用整数,如:{highest=1, lowest=5)assignment元素可选为task委派一个参与者。event元素[0..*]支持的事件类型有:{task-create|task-start|task-assign|task-end}. 特别要指出的是,我们在task-assign 事件上为任务实例添加了一个非持久化的属性previousActorId exception-handler元素[0..*]对委派类异常的处理者timer元素[0..*]为任务的执行过程指定一个计时器,监视任务的执行。这里我们可以利用 cancel-event 同计时器挂钩来做一些特定的事。默认情况下, cancel-event会结束任务,但我们可以将它定制为任务分配或者任务开始。controller元素[0..1]指定如果将过程变量转换成任务表单参数以提供给用户交互界面
<assignment>(分配)
名称类型多样性描述expression属性可选由于历史原因,这里的expression不是指jPDL 表达式,而是指jBPM 身份组件中的表达式,详细参考Section 11.11.2, “Assignment expressions”. 注意,该属性必须依赖于jbpm身份组件 actor-id属性可选参与者ID. 该属性可以与pooled-actors属性联合使用。可以设计一个表达式来替代;也可以设定一个固定值; 又或者指定一个属性或方法,返回一个诸如actor-id="myVar.actorId"的字符窜,这里 myVar 是一个任务实例对象,它将调用方法getActorId 返回真实的actor-idpooled-actors属性可选一个由逗号分隔的参与者ID列表.一个固定的列表,诸如: pooled-actors="chicagobulls, pointersisters". 又或者使用表达式返回。还可以引用一个属性或方法,返回字符串数组变量、集合变量以及用逗号分隔的字窜来表达参与者集合。class属性可选实现 org.jbpm.taskmgmt.def.AssignmentHandler接口的Java类全名config-type属性可选对AssignmentHandler实现类的初始化方式,可选值有:{field|bean|constructor|configuration-property}. {内容}可选作为初始化参数用来初始化AssignmentHandler的实现类.
- 学习JBPM
- jbpm学习
- jBPM学习
- Jbpm学习
- jbpm学习
- jBPM学习(四)----体验jbpm
- jBPM学习(七)----jBPM相关概念
- JBPM学习---JBPM流程的部署
- JBPM学习(一):eclipse集成JBPM
- JBPM学习(一):eclipse集成JBPM
- Jboss JBPM 学习点滴
- jbpm指南部分学习
- 学习jbpm部署部分
- JBPM的学习过程
- JBPM学习笔记
- Jboss JBPM 学习点滴
- 一步一步学习jbpm(一)
- jbpm学习中。。。。
- Win2003上SVN无法使用解决方案
- 存折打印机EPSON PLQ-20K 联机不打印的设置
- 嵌入式C语言16道试题
- 根据isbn查询图书信利用豆瓣的API
- SQL Server 2005无法安装的解决方法(转)
- jbpm学习
- 实模式寻址
- 牛人的blog
- WIN7下JDK+TOMCAT环境的配置与常见错误的解决办法
- 浅谈8051的学习方法
- 无奈的心境
- HDU 3435 A new Graph Game //KM
- 数据结构:TRIE树
- 保护模式下如何寻址