BPM业务流程管理JBBPM精要讲义及培训课件_第1页
BPM业务流程管理JBBPM精要讲义及培训课件_第2页
BPM业务流程管理JBBPM精要讲义及培训课件_第3页
BPM业务流程管理JBBPM精要讲义及培训课件_第4页
BPM业务流程管理JBBPM精要讲义及培训课件_第5页
已阅读5页,还剩166页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【最新卓越管理方案您可自由编辑】

(BPM业务流程管

理)JBBPM精要讲义及培

训课件

2020年5月

多年的企业咨询顾问经验,经过实战验证可以落地执行的卓越管理方案,值得您下载拥有

JBossjBPM3.0

下一页

JBossjBPM3.0

WorkflowandBPM实践

目录

L介绍

l.L综述

12TheJBossjBPM新手工具箱

L3.TheJBossjBPM流程图形设计器

1.4.TheJBossjBPM核心组件

15TheJBossjBPM控制台w制应用

1.6.TheJBossjBPM身份组件

L7.TheJBossjBPM日程安排程序

L8.TheJBossjBPM兼容数据库包

L9.TheJBossjBPMBPEL扩展

2.开始

2.1.下载一览

2.1.1.iBPM3

2.1.LL新手工具箱

2.1.12核心引擎和身份组件

2.L13数据库扩展

2.12jBPM流程设计器

2.121.Eclipse更新站点

2.1.22Eclipse特点

2.1.3.jBPMBPEL扩展

22TheJBossjBPM项目目录

2.3.公开CVS访问

3.指南

3.1.HelloWorld例子

32数据库例子

3.3.上下问(context)例子:流程变量

34任务分派例子

35定制动作Action例子

4.面向图的程序设计

4.1.缺少的一环

42图解表示和开发过程

43习惯方法

44什么是面向图的程序设计

45组建块

5.发布

5.L运行时的相关部分

5.1.LJava运行环境

5.12jBPM库

5.13运行时需要的库

52配置文件

5.2.1.perties

522.Hibernatecfgxmlfile

523.业务日历配置文件

524.变量映射配置稳健

525.转换器配置文件

526.缺省模块配置文件

527.流程文档解析器配置文件

53在Web应用程序中使用jBPM

54在EJB包容器中使用中PM

6.永久化

6.L永久化API

62数据库配置

6.3.管理事务

64jBPM数据库

6.4.1.Hibernate集成

6.42开发数据库是hsqldb

6.4.3.其他数据库的支持

6.44高速缓冲存储器

6.5.Hibernate定制

7.流程模型

7.1.综述

7.2.流程图(processGraph)

7.3.节点(Nodes)

7.3.1.节点(Node)职责

7.3.2.节点类型(Nodetype)任务(task-node)

7.3.3.节点类型(Nodetype)状态(state)

7.3.4.节点类型(Nodetype)判定(decision)

7.35节点类型(Nodetype)分叉(fork)

7.3.6.节点类型(Nodetype)联合(join)

7.3.7.节点类型(Nodetype)节点(node)

7.4.动作(Actions)

741.动作配置

7.42动作引用

7.4.3.事件

7.44事件传播

7.4.5.Script

746.定制事件

7.5.超状态(superstate)

7.5.1.超状态变迁

7.52超状态事件

753.分级名字

76异常处理

7.7.流程组成

78定制节点行为

79图(Graph)执行

8.上下文(Context)

8.1.存取变量

82变量的使用期限

8.3.变量永久化

8.4.变量范围

8.4.1.变量重载(overloading)

8.42变量重写(overriding)

85瞬间变量

8.6.定制变量永久化

9.任务管理

9」.任务

92任务实例

921.任务实例生命周期

922.任务实例及图执行

9.3.委派(Assignment)

9.3.1.委派接口

9.32委派数据模型

9.3.3."推"模型

9.3.4."拉"模型

9.4.泳道(Swimlanes)

95任务事件

9.6.任务定时器

9.7.任务控制器

98定制任务实例

99身份组件

991.身份模型

9.92赋值表达式

9.921.第一个术语

9.922.下一个术语

993.删除身份组件

1。调度程序

101定时器

102调度程序发布

11业务日历

11.L持久时间

112配置

12.记录

12.1.建立日志

122日志检索

123数据仓库

13.jBPM流程定义语言(JPDL)

13.L流程档案

13.1.L发布流程档案

13.12流程版本(versioning)

13.1.3.流程转换(conversion)

132代理

1321.jBPM类载入器

13.22流程类载入器(classloader)

1323.代理配置

1323.1.配置类型field

13232配置类型bean

.酉己置类型constructor

.酉己置类型configuration-property

13.3.JPDLxmlschema

13.3.1.process-definition(流程定义)

13.32node(节点)

13.3.3.commonnodeelements(常见节点元素)

13.3.4.start-state(开始状态)

13.3.5.end-state(结束状态)

13.3.6.state(状态)

13.3.7.task-node(任务节点)

13.3.8.process-state(流程状态)

13.3.9.super-state(超状态)

13.3.10.fork(交叉)

13.3.11.join(联合)

13.3.12.decision(判定)

13.3.13.event(事件)

13.3.14.transition(转换)

13.3.15.action(动作)

13.3.16.script(脚本)

13.3.17.expression(表达式)

13.3.18.variable(变量)

13.3.19.handler(处理器)

13.3.20timer(定时器)

13.3.2Lcreate-timer(建立定时器)

13.3.22.cancel-timer(放弃定时器)

13.3.23.task(任务)

13.3.24.swimlane(泳道)

13.3.25.assignment(委派)

13.3.26.controller(控制器)

13.3.27.sub-process(子流程)

13.3.28.condition(条件)

13.3.29.exception-handler(异常处理)

14.安全

14.1.要做的

142验证

143授权

15.TDDforworkflow

15.1.IntroducingTDDforworkflow

152XMLsources

1521.Parsingaprocessarchive

15.22Parsinganxmlfile

1523.ParsinganxmlString

15.3.Testingsubprocesses

16.可插入架构

下一步

Chapter1.介绍

第一章:介绍

前一页后一页

第一章:介绍

JBossjBPM是一个复杂的可扩展的工作流管理系统.JBossjBPM有直观的流

程语言来表示商业流程图的术语比如,任务,异步通讯的等待状态,定时器,自动操

作等等.把这些操作绑在一起〃JBossjBPM就有了最强大和易扩展性的控制流

机制.

JBossjBPM只有最小的倚赖性可以很容易的作为java库来使用.当然它也可以

用在吞吐量极为关键的J2EE群应用服务器环境中.

JBossjBPM可以同任何数据库配置可以部署在任何应用服务器上.

1.1.综述

核心工作流和BPM功能被封状作为一个简单的Java库.这个库包括在jBPM数

据库中存储,更新和检索流程信息的服务

Figure1.1.JBossjBPM组件一览

1.2.JBossjBPM新手工具箱

新手工具箱是包含了jBPM所有组件包在一个可下载的包里.

这个包包括:

jbpm-server,预先配置的jboss应用服务器.

jbpm-designer,jBPM流程图形化设计器的eclipse插件.

jbpm-dbJBPM数据库兼容包(参看下面).

jbpm,核心jbpm组件包括库和本手册.

jbpm-bpel,JBossjBPMBPEL扩展参考.

预配置的JBoss应用服务器有下列安装组件:

核心jBPM组件,打包作为JBoss服务档案

一个包括所有jBPM表格的完整数据库:默认的hypersonic数据库

包含所有的jBPM表格和已经定义的流程.

jBPM控制台web应用程序这个可以用来为jBPM管理员.

jBPM调度程序所有定时器的执行.调度程序在新手工具箱里配置成了

一个servlet.这个Servlet会为产生一个线程来监视每个定时器的执行.

一介流程例子已经发布进了jBPM数据库.

1.3.JBossjBPM图形化流程设计器

JBossjBPM也包括一个图形化的流程设计工具.这个设计器是用来创作商业流

程的

JBossjBPM图形设计器是一个Eclipse插件.独立安装版本的设计器工具已经

在开发路线图里了.

图形化设计工具最重要的特性是它同时支持业务分析员和技术开发人员.这样

就可以在业务流程建模和实际执行之间平滑转换.

插件可用做为本地的updatesite(Eclipse纯粹的zip文件),用做符合Eclipse软

件更新机制的安装包.当然你也可以把它展开到你的Eclipse的安装目录.

1.4JBossjBPM核心组件

JBossjBPM核心组件是纯粹的Java(J2SE)软件,来处理流程定义和运行时的流

程实例执行.

JBossjBPM是一个Java库.因此它可以用在任何java环境比如web应用程

序,Swing应用程序,EJB,WebService等等.jBPM库可以被打包作为sateless

sessionEJB(无状态会话EJB).这可以用做集群的发布具有极高的吞吐量可伸缩

性.无状态会话EJB根据J2EEL3规范重新写过所以可以发布到任何应用服务器

上.

JBossjBPM核心组件被打包成一个简单的Java库文件.依赖你所使用的功能

性,库jbpm-3.0.jar及一些相关的第三方的库比如.hibernate,dom4j等等.这些

相关性在第五章发布有清晰的描述

永久性方面,jBPM内部使用hibernate.除了传统的0/R映射外,hibernate也

分析不同数据库系统的SQL方言,这使jBPM在当前所有的数据库上都可以移

植.

JBossjBPMAPI可以从项目中任意编写的Java软件访问,比如Web应用程

序,EJB,或webService组件,消息bean或其他java组件.

1.5.JBossjBPM控制台web应用程序

jBPM控制台web应用程序是为两个目的服务的.首先,它作为流程执行运行时

间任务生成的中央用户接口.其次,它也是一个管理和监视控制台允许检查和操

作运行中的流程实例.

1.6.JBossjBPM身份组件

JBossjBPM可以集成进任何包含公司用户和组织信息的目录.对项目来说从那

里得到组织信息组件不是容易得到的,JBossjBPM就包含这个组件.身份组件

使用的模型比通常的servlet,ejb和门户模型跟富有.

更多信息可参考章节信9,"身份组件"

1.7.JBossjBPM调度程序

JBossjBPM调度程序是用来监视和运行已经计划到时执行流程的定时器的组

件.

定时器组件被打包在核心jbpm库中,但是它需要被发布到下面的任一环境中:

要不你把调度程序Servlet来产生监视线程或者就必须用独立的JVM来调用调

度程序的main方法.

1.8.JBossjBPM数据库兼容包

JBossjBPM数据库兼容包包括所有支持数据库的相关信息JDBC驱动程序和

数据库初始化脚本.

1.9.JBossjBPMBPEL扩展

JBossjBPMBPEL扩展是独立的扩展包用来支持BPEL(BusinessProcess

ExecutionLanguage商业流程执行语言).BPEL的基本要素是xmlScripting

语言用来写其他webserver的webservices.

前一页Up后一页

JBossjBPM3.0首取第二章:开始

第二章开始

前一页后一页

第二章开始

本章将带你如何获得JBossjBPM的第一步并且提供

立即运行的初始提示.

2.1.下载包一览

下面是当前可用的不同jBPM包清单.这些包中的每一个都包含一个或多个可下

载的文件.同这些文件一起的包含一个描述它的内容及相关安装的指示

所有下面下载的描述都可以在thesourceforgejbpm下载页面.上找到

2.1.1.jBPM3

这是主要的发行包,包括了主要核心引擎和数个额外的你使用jBPM的时候可能

用得上的包.下载这个包的文件从这里.

.新手工具箱

如果你想尽快开始运行jBPM,那么这就是你想下载的文件.工具箱包含了所有

jBPM的模块以及图形化的设计工具在一个单独下载的文件里名字为:

'jbpm-starters-kit-<version>.zip'.展开这个压缩文件到目录下阅读

,readme.html,获取更多信息、.有了这个工具箱,你可以立即开始进入第三章

讲座.

.核心引擎和身份组件

下载文件名为‘jbpm-<version>.zip,包含jBPM核心引擎也包含角色和组管

理的身份组件.开始工作前,展开文件到一个目录下,然后‘jbpm-〈version〉,文

件夹下找到包含重要的参考信息的‘readme.html,文件

2.1.13.数据库扩展

如果你想改变jBPM的默认数据库(HypersonicHSQLDB),你需要下载这个

包.文件名为‘jbpm-db-<version>.zip,包含你改变数据库需要的各种资源.包

含,数据库建立脚本,hibernate属性文件及数据库JDBC驱动程序.如何操作

的步骤包含在'readme.html,文件里,它在你展开这个压缩包的最上层的目录

下.

2.1.2.jBPM流程设计器

ThesecondpackagecontainsthedownloadsrelatedtothejBPM

GraphicalProcesDesigner.Thedesignerenablesyoutoauthoryour

processdefinitionsandtoeasilydeploythem.Youcanfindthese

downloadshere.Thedesignerisaplug-infortheEclipseplatformwhich

isavailablefordownloadeitherasazippedEclipsefeatureorasazipped

Eclipseupdatesite.Thereisnodifferenceincontent,theonlydifference

isinthewayyouhavetodotheinstallation.

.Eclipse更新站点

Ifyouwanttobeabsolutelysurethatthedesignerinstallationgoes

smoothly,werecommendtousetheupdatesitemechanismtogether

withanewEclipseinstallation.OfcourcetheEclipseversionshould

matchthedownloadedupdatesitearchive.ToobtaintheProcess

DesignerUpdateSite,youshoulddownloadthefile

'jbpm-gpd-site-<version>.zip'.Thenfollowtheinstructionsinthe

'readme.html'fileincludedinthearchivesrootfoldertosuccesfully

installtheGPD.

.Eclipse特性

IfyouaretiredofeachtimehavingtodoafreshEclipseinstallationand

youarewillingtocopewithsomepossibleissues,youcantrythefeature

download.Inthiscaseinstallationisaseasyasextractingthearchiveinto

yourEclipseinstallation(makesuretheincluded'plugins'and'features'

foldersendupinthesamelocationofyourEclipseinstallation)

overwritingthefilesandfolderswiththesamenamethatarepossibly

alreadypresent.Thisinstallationisveryeasy,butyoucouldruninto

incompatibilityissueswhenyouoverwritepluginsalreadypresentin

yourinstallationbecauseofotherfeaturesthatyoudidinstall.Though

theyhavethesamenameitcouldhappenthattheversionsofthese

collidingpluginsarenotequal,hencethepossibleincompatibilities.

Downloadthefile'jbpm-gpd-feature-<version>.zip'toobtaintheGPD

feature.Theinstallationinstructionsarerepeatedinthe'readme.html'

file.

2.1.3.jBPMBPEL扩展

第三个也是最后一个包包含jBPMBPEL扩展.它只包含一个文件:

'jbpm-bpel-<version>.zip'.你可以找到这个包在这里.要开始BPEL扩展,在

doc目录下找到User'sGuide.

2.2.JBossjBPM项目号码簿

professionalsupport:JBossisthecompanythatbacksthisprojectwith

professionalsupport,trainingandconsultancyservices.

userguide:isthedocumentyou'rereadingandservesasthemainentry

pointintotheproject.

downloaddescriptions:descriptionofthedownloadables

downloads:sourceforgedownloadpageforjBPM

forums:getincontactwiththecommunity,askquestionsanddiscussjBPM

wiki:extrainformation,mostlyprovidedbythecommunity

issuetracker:forsubmittingbugsandfeaturerequests

roadmap:showswhattoexpectinthenextversions

mailinglists:mailinglistsareusedforannouncements

javadocs:partofthedownloadinthedoc/javadocdirectory,

cvs:thedetailsofhowtogetthejBPMsourcesfromCVS

2.3.公开的CVS访问

另外,你可以通过JBossjBPMcvs服务器得到jBPM

服务器的信息如下

Connectiontype:pserver

User:anonymous

Password:

Host:

Port:2401(whichisthedefault)

Repositorypath:/cvsroot/jbpm

Label::pserver:anonymous@/cvsroot/jbpm

第三章.讲座

前一页后一页

第三章.讲座

这个讲座将展示如何建造一个jpdl和如何使用API的方法来管理运行时的执行.

这个讲座的方式是解释一系列的例子.每个例子将集中关注特别的主题和额外

的说明.这些例子可以在jBPM包的examples目录下找到.

最好的方法就是学着来建立一个Project实验所给的例子.

eclipse用户注意:下载jbpm-3.0-[version].zip并且解压缩到系统.然后从菜单

"File"-->"Import..."-->"ExistingProjectintoWorkspace".点"Next"然

后浏览jBPM根目录然后点击"Finish".现在你的有了jbpm3project了.你

可以发现这个讲座目录在目录src/java.examples/….你打开这些例子后,可以运

行它们"Run""RunAs..."->"JUnitTest"

jBPM包括一个图形设计器来产生例子中的XML.你可以从这里下载和学习有

关图形设计器的说明节2.1,"下载一览"

3.1.HelloWorld例子

一个流程是有一个定向图(directedgraph)来定义,由节点和变换组成.hello

world流程有3个节点.如下看如何组合起来,我们先开始一个简单的流程不使

用图形设计器.下面的图形表示helloworld流程:

Figure3.1.helloworld流程图

publicvoidtestHelloWorldProcess(){

//这个方法展现流程定义和流程执行的定义

//流程定义有3个节点.

//一个未命名的开始状态start-state,一个状态,s'

//一个结束状态名字为'end.

//下面行解析一个xmltext为一个ProcessDefinition对象(流

程定义)

//ProcessDefinition把流程定义形式描述为java对象

ProcessDefinitionprocessDefinition=

ProcessDefinition.parseXmlString(

"<process-definition>"+

"<start-state>"+

〈transitionto='s'/>"+

"</start-state>"+

"<statename='s'>"+

"〈transitionto='end'/>"+

"</state>"+

"<end-statename='end'/>"+

"</process-definition>"

);

//下一行建立了一个流程执行定义.

〃在构造后,流程执行有一个主要的执行路径

//(=roottoken根令牌)此时位置在start-state处

Processinstanceprocessinstance=

newProcessInstance(processDefinition);

//在构造后流程执行有一个主要的执行路径

//(=roottoken根令牌).

Tokentoken=processInstance.getRootToken();

//构造后,位置处于流程定义执行路径start-state的位置

assertSame(processDefinition.getStartState(),token.getNodeO);

//现在开始流程执行,离开start-state结束默认的转换(transition)

token.signal();

//这个signal方法将会阻塞直到流程执行进入wait状态

//流程执行在状态's'进入第一个等待状态

//因此执行主路径现在位置在状态's'

assertSame(processDefinition.getNode("s"),token.getNode());

//我们再送另外一个信号signal.这将继续执行离开状态M结束默

认的转换(transition)

token.signal();

//现在信号signal方法将返回,因为流程实例到达了end-state结

束状态

assertSame(processDefinition.getNode("end"),token.getNode());

)

32数据库例子

jBPM一个基本的特性是当流程处于等待状态时候可以把流程执行永久化到数

据库中.下一个例子想你展示了如何存储一个流程实例到jBPM数据库中.例

子给出一个将会发生的上下文.分开的方法用来建立不同部分的用户代码.比如

一部分用户代码在web应用程序中开始一个流程并永久化执行到数据库中.然

后,messagedrivebean从数据库中载入流程实例并继续它的执行

jBPM永久化的更多内容可以参看第六章,永久化.

publicclassHelloWorldDbTestextendsTestCase{

//我们在每个应用程序中需要一个JbpmSessionFactory.因

此我们把它放在一个静态变量中

//JbpmSessionFactory在test方法中来建立一个

JbpmSession's.

staticJbpmSessionFactoryjbpmSessionFactory=

JbpmSessionFactory.buildJbpmSessionFactoryO;

static{

//因为HSQLDBin-memory数据库是干净的数据库,

//在我们开始测试前,我们需要建立table.

//Thenextlinecreatesthedatabasetablesandforeignkey

//constraints.

jbpmSessionFactory.getJbpmSchema().createSchema();

)

publicvoidtestSimplePersistence(){

〃在3个方法调用下面方法中间,所有数据被写入数据库

//在单元测试中,这3个方法被正确执行在每个方法之后

//因为我们想完成测试流程场景

//但在实际中这些方法代表着server不同的请求

//因为我们开始的数据库是个干净的数据库,我们需要首先发

布流程在里面

//在真实中,这个是由流程开发人员完成的

deployProcessDefinition();

〃假定我们想开始流程实例(=流程执行)

//当用户提交一个Web表单的时候.

processInstancelsCreatedWhenllserSubmitsWebappFormO;

//然后,到达的异步消息将继续执行

theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();

)

publicvoiddeployProcessDefinition(){

〃定义一个流程,包括三个及点,一个未命名的start-state,一个状态‘s'

〃一个结束状态end-state名字'end'.

ProcessDefinitionprocessDefinition=

ProcessDefinition.parseXmlString(

"<process-definitionname='helloworld'>+

"<start-statename='start'>+

"〈transitionto='s'/>+

"</start-state>+

"<statename='s'>+

〈transitionto='end'/>+

"</state>+

<end-statename='end'/>+

"</process-definition>

);

//打开新的永久层会话

JbpmSessionjbpmSession=

jbpmSessionFactory.openJbpmSession();

//并且在永久层会话上开启事务

jbpmSession.beginTransaction();

〃保存流程定义到数据库中

jbpmSession

.getGraphSession()

.saveProcessDefinition(processDefinition);

//提交事务

jbpmSmitTransaction();

//关闭会话.

jbpmSession.close();

)

publicvoid

processInstancelsCreatedWhenUserSubmitsWebappFormO{

//这个方法里的代码可以放在structsaction或JSF管理bean

//打开一个新的永久层会话

JbpmSessionjbpmSession=

jbpmSessionFactory.openJbpmSession();

//启动事务.

jbpmSession.beginTransaction();

//查询数据库得到我们在上面步骤发布的流程定义

ProcessDefinitionprocessDefinition=

jbpmSession

,getGraphSession()

,findLatestProcessDefinition("helloworld");

//有了从数据库中的得到的processDefinition,

〃我们就可以建立流程执行定义比如helloworld例子(它没有永久

化).

Processinstanceprocessinstance=

newProcessInstance(processDefinition);

Tokentoken=processInstance.getRootToken();

assertEquals("start",token.getNode().getName());

//开始流程执行

token.signal();

//流程在状态'S'.

assertEquals("s",token.getNode().getName());

//流程实例被保存在数据库

//所以当前流程执行的状态被保存进数据库

jbpmSession

.getGraphSession()

.saveProcessInstance(processInstance);

〃Themethodbelowwillgettheprocessinstancebackout

//ofthedatabaseandresumeexecutionbyprovidinganother

//externalsignal.

//web应用程序动作结束出,事务被提交.

jbpmSmitTransaction();

//关闭jbpmSession.

jbpmSession.close();

)

publicvoid

theProcessInstanceContinuesWhenAnAsyncMessageIsReceived(){

//这个代码可以包含在messagedrivenbean中.

//打开新的永久性的会话.

JbpmSessionjbpmSession=

jbpmSessionFactory.openJbpmSession();

//永久化会话上开始事务

〃说明它也可能使用应用服务器的DataSource的JDBC连

jbpmSession.beginTransaction();

GraphSessiongraphSession=jbpmSession.getGraphSession();

//First,weneedtogettheprocessinstancebackoutofthe

database.

//Thereareseveraloptionstoknowwhatprocessinstancewe

aredealing

//withhere.Theeasiestinthissimpletestcaseisjusttolook

for

//thefulllistofprocessinstances.Thatshouldgiveusonlyone

//result.Solet'slookuptheprocessdefinition.

ProcessDefinitionprocessDefinition=

graphSession.findLatestProcessDefinition("helloworld");

//现在,我们搜索这个流程定义的所有流程实例.

Listprocessinstances=

graphSession.findProcessInstances(processDefinition.getId());

//Weknowthatinthecontextofthisunittestthereis

〃onlyoneexecution.Inreallife,theprocesslnstanceldcanbe

//extractedfromthecontentofthemessagethatarrivedor

from

//theusermakingachoice.

Processinstanceprocessinstance=

(Processinstance)processInstances.get(O);

//我们可以继续执行.说明流程实例委托信号到执行主路径(=

theroottoken)

processlnstance.signal();

//在singal后,我们知道流程执行应该到end-state

assertTrue(processInstance.hasEnded());

//现在我们可以更新执行状态到数据库中

graphSession.saveProcessInstance(processInstance);

〃MDB结束,事务被提交.

jbpmSmitTransaction();

//jbpmSession被关闭.

jbpmSession.closeQ;

)

)

3.3.上下文例子:流程变量

在流程执行时候流程变量包含上下文信息.流程变量同java.util.Map相似映射

名字到值,值可能是个java对象.流程变量被永久化作为流程实例的一部分.为

了让事情简单,这个例子中我们仅仅展示使用变量的API而没有永久化.

关于变量的更多信息可以参看第8章上下文

//这个例子也是从helloworld流程开始.

//甚至没有修改.

ProcessDefinitionprocessDefinition=ProcessDefinition.parseXmlString(

"<process-definition>"+

"<start-state>"+

"<transitionto='s'/>"+

"</start-state>"+

"<statename='s'>"+

"<transitionto='end'/>"+

"</state>"+

"<end-statename='end'/>"+

"</process-definition>"

);

Processinstanceprocessinstance=

newProcessInstance(processDefinition);

//从流程实例中为流程变量获得上下文实例

Contextinstancecontextinstance=

processInstance.getContextlnstanceO;

//在开始之前流程离开了start-state,

//我们准备设置一些流程变量在流程实例上下文中

contextInstance.setVariable("amount",newInteger(500));

contextInstance.setVariable("reason","imetmydeadline");

//从现在开始,这些变量同流程实例关联

//流程变量可以从用户代码中通过下面展示的API来访问

//可可以在动作Action和节点的实现中访问

//流程变量也作为流程实例的一部分保存进数据库

processlnstance.signal();

//访问变量通过contextinstance.

assertEquals(newInteger(500),

contextinstance.getVariable("amount"));

assertEquals("imetmydeadline",

contextinstance.getVariable("reason"));

3.4.任务分派例子

在下个例子里我们将要展示你怎么才能分派一个任务给一个用户因为jBPM工

作流引擎和组织模型是分开的,一种用来计算参与者表达语言总是受限的.因此,

你不得不指定AssignmentHandler的实现来计算任务的参与者.

publicvoidtestTaskAssignment(){

//这个流程展示基于helloworld流程.

//状态节点被task-node代替.task-node在JPDL中是表示一

个等待状态并且

//产生一个在流程继续执行前要完成的任务

ProcessDefinitionprocessDefinition=

ProcessDefinition.parseXmlString(

"<process-definitionname='thebabyprocess'>"+

"<start-state>"+

<transitionname='babycries'to='t'/>"+

"</start-state>"+

"<task-nodename='t'>"+

<taskname='changenappy'>"+

<assignment

class='org.jbpm.tutorial.taskmgmtNappyAssignmentHandler'/>"+

"</task>"+

"<transitionto='end'/>"+

"</task-node>"+

"<end-statename='end'/>"+

"</process-definition>"

);

//产生一个流程执行定义.

Processinstanceprocessinstance=

newProcessInstance(processDefinition);

Tokentoken=processInstance.getRootToken();

//开始流程执行,完整默认的转换后离开start-state

token.signal();

//signal方法将被阻塞知道流程执行进入等待状态.

//在这个case中是指task-node.

assertSame(processDefinition.getNode("t"),token.getNode());

//当执彳亍至U达task-node,彳壬务'changenappy'

//被建立并且NappyAssignmentHandler被调用来决定任务将分派给睡

//NappyAssignmentHandler返回'papa'

//在真实环境中,任务将会从数据库中获取,通过or

g.jbpm.db.TaskMgmtSession.

//因此这个例子中我们不想包括复杂的永久化

//我们只是得到这个流程实例的第一个task-实例

(weknowthereisonlyoneinthistest

//我们知道在这介测试场景中这里只有一个).

Taskinstancetaskinstance=(Taskinstance)

processinstance

.getTaskMgmtInstance()

,getTaskInstances()

,iterator().next();

//现在,我们检查taskinstance实际分配给了‘papa'.

assertEquals("papa",taskinstance.getActorId());

〃现在,我们期望'papa,完成了他的任务并且标记任务是完成

tasklnstance.end();

//因为这是最后(唯一的)要做的任务,这个任务的完成触发

//流程实例的继续执行.

assertSame(processDefinition.getNode("end"),token.getNode());

}

3.5.客户化动作例子

动作action是绑定你自己的定制java代码和jBPM流程的一种机制.动作可以

同它自己的节点关联起来(如果它们在流程图表示中相关).动作也可以放在事

件event上比如.takingatransition,leavinganode或者enteringanode.

在这个case,动作不是图表的一部分,但是它们在流程执行产生事件的时候,也会

被执行.

我们将用一个例子:MyActionHandler来观察动作的实现.这个动作handler实

现不是什么非常特别的事情.它只是设置boolean变量isExecuted为true.变

量isExecuted是静态的因此它可以在actionhandler内部被访问.

关于动作action的内容可以参看7.4节,"动作"

//MyActionHandler就是一个class可以在jBPM流程执行时候在某

些用户代码里被执行

publicclassMyActionHandlerimplementsActionHandler{

//在测试之前,isExecuted被设置为

false.

publicstaticbooleanisExecuted=false;

//动作将设置true因此当动作被执行

//unittest将会展示

publicvoidexecute(ExecutionContextexecutioncontext){

isExecuted=true;

)

)

//每次测试开始都要设置MyActionHandler的成员static

isExecuted为

false.

publicvoidsetUp(){

MyActionHandler.isExecuted=false;

)

我们将要在转换时开始一个动作

publicvoidtestTransitionAction(){

〃Thenextprocessisavariantofthehelloworldprocess.

//Wehaveaddedanactiononthetransitionfromstate's'

//totheend-state.Thepurposeofthistestistoshow

//howeasyitistointegratejavacodeinajBPMprocess.

ProcessDefinitionprocessDefinition=

ProcessDefinition.parseXmlString(

"<process-definition>"+

"<start-state>"+

"<transitionto='s'/>"+

"</start-state>"+

"<statename='s'>"+

<transitionto='end'>"+

<action

class='org.jbpm.tutorial.action.MyActionHandler'/>"+

"</transition>"+

"</state>"+

"<end-statename='end'/>"+

"</process-definition>"

);

〃Let'sstartanewexecutionfortheprocessdefinition.

Processinstanceprocessinstance=

newProcessInstance(processDefinition);

//Thenextsignalwillcausetheexecutiontoleavethestart

//stateandenterthestate's'

processInstance.signalO;

//这里将显示MyActionHandler还没有被执行

assertFalse(MyActionHandler.isExecuted);

//...andthatthemainpathofexecutionispositionedin

//thestate's"

assertSame(processDefinition.getNode("s"),

processInstance.getRootToken().getNode());

//Thenextsignalwilltriggertheexecutionoftheroot

//token.Thetokenwilltakethetransitionwiththe

//actionandtheactionwillbeexecutedduringthe

〃calltothesignalmethod.

processInstance.signalO;

〃HerewecanseethatMyActionHandlerwasexecutedduring

//thecalltothesignalmethod.

assertTrue(MyActionHandler.isExecuted);

)

下一个例子是同样的动作,但动作被分别放在enter-node和leave-node事件.

注意节点同转换相比有超过一个事件类型(eventtype)转换(transition)只有一

个事件.

ProcessDefinitionprocessDefinition=ProcessDefinition.parseXmlString(

"<process-definition>"+

"<start-state>"+

"<transitionto='s'/>"+

"</start-state>"+

"<statename='s'>"+

<eventtype='node-enter'>"+

<actionclass='org.jbpm.tutorial.action.MyActionHandler'

/>"+

"</event>"+

"<eventtype='node-leave'>"+

<actionclass='org.jbpm.tutorial.action.MyActionHandler'

/>"+

</event>"+

"<transitionto='end'/>"+

"</state>"+

"<end-statename='end'/>"+

"</process-definition>"

);

Processinstanceprocessinstance=

newProcessInstance(processDefinition);

assertFalse(MyActionHandler.isExecuted);

//Thenextsignalwillcausetheexecutiontoleavethestart

//stateandenterthestate's'.Sothestate's'isentered

//andhencetheactionisexecuted.

processlnstance.signal();

assertTrue(MyActionHandler.isExecuted);

//Let'sresettheMyActionHandler.isExecuted

MyActionHandler.isExecuted=false;

//Thenextsignalwilltriggerexecutiontoleavethe

//state's'.Sotheactionwillbeexecutedagain.

processlnstance.signal();

//Voila.

assertTrue(MyActionHandler.isExecuted);

第四章.面向图的程序设计

前一页后一页

第四章.面向图的程序设计

当前工作流和业务流程管理(BPM)的总体发展来说是极其零碎的.在一些工具,规

范和学术界发现很少的统一意见.传统方法导致笨重的,单系统把大量的功能包

含在一个单一的系统中

Java开发语言中缺少的特性导致在这个范围产生了完整系列的解决方法.这个

文章将标识缺少的特性并且提出一个简

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论