深入浅出jBPM电子书.docx
- 文档编号:30151624
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:133
- 大小:226.95KB
深入浅出jBPM电子书.docx
《深入浅出jBPM电子书.docx》由会员分享,可在线阅读,更多相关《深入浅出jBPM电子书.docx(133页珍藏版)》请在冰豆网上搜索。
深入浅出jBPM电子书
深入浅出jBPM电子书
第1章介绍
JBOSSjBPM是一个灵活的、可扩展的工作流管理系统。
JBOSSjBPM拥有直观的流程语言,用任务、异步的等待状态、定时器、自动化动作…等来表示业务流程图,把这些操作绑定在一起,JBOSSjBPM就拥有了非常强大和可扩展的控制流机制。
JBOSSjBPM只有最小的依赖,可以象使用java库一样非常容易的使用它。
另外,也可以通过把它部署在J2EE集群应用服务器中,用在吞吐量极为关键的环境中。
JBOSSjBPM可被配置为任何数据库,并且可以部署到任何应用服务器。
1.1概述
核心工作流和BPM功能被打包为一个简单的java库,这个库包括一个存储到数据库、从数据库更新和获取流程信息的服务。
图1.1JBOSSjBPM组件概观
1.2JBOSSjBPM入门套件
入门套件是一个包含了所有jBPM组件的下载包,包括:
l Jbpm-server,一个预配置好的jboss应用服务器。
l Jbpm-designer,图形化设计jBPM流程的eclipse插件。
l Jbpm-db,jBPM数据库兼容包(见下文)。
l Jbpm,核心jbpm组件,包括库和本指南。
l Jbpm-bpel,JBOSSjBPMBPEL扩展参考。
预配置好的JBOSS应用服务器安装了下列组件:
l 核心的jBPM组件,被打包为了一个服务档案。
l 一个包括jBPM库表的集成数据库:
默认的hypersonic数据库包含了jBPM表,另外还包含一个流程。
l jBPM控制台web应用程序,可以由流程参与者使用,也可以由jBPM管理员使用。
l jBPM调度程序,用于定时器执行。
调度程序在入门套件中被配置为一个servlet,这个servlet将产生一个线程来监视和执行定时器。
l jBPM命令执行器,用于命令的异步执行。
命令执行器也被配置为一个servlet,这个servlet将产生一个线程来监视和执行命令。
l 一个流程实例,已经被部署到了jBPM数据库中。
1.3JBOSSjBPM图形化流程设计器
JBOSSjBPM还包括一个图形化设计工具,这个设计器是一个创作业务流程的图形化工具。
JBOSSjBPM图形化流程设计器是一个eclipse插件,可以独立安装的设计器已经在开发目标中。
图形化设计器非常重要的特性是它同时支持业务分析者和技术开发者,这使的业务流程建模可以平滑的转换到实际实现。
插件可以被用作本地更新设置(普通的zip文件),通过标准的eclipse软件更新机制安装。
另外还有一个包,你可以直接把它解压到eclipse主目录里。
1.4JBOSSjBPM核心组件
JBOSSjBPM核心组件是普通java(J2SE)软件,用来管理流程定义和流程实例执行的运行时环境。
JBOSSjBPM是一个java库,因此,它可以被用在任何java环境,例如web应用、swing应用、EJB、webservice…等,jBPM库还可以被打包为无状态会话EJB,这允许被作为集群部署,并且适用于极高的吞吐量。
无状态会话EJB按照J2EE1.3规范编写,因此它可以部署到任何应用服务器。
JBOSSjBPM核心组件被打包为一个简单的java库文件,依赖于你所使用的功能,jbpm-3.0.jar库对第三方库有些依赖,如hibernate、dom4j和其他,这些在“第5章部署”TODO中有清晰的说明。
为了持久化,jBPM内部使用hibernate,除了传统的O/R影射之外,hibernate还解决了不同数据库之间的SQL方言(dialect)问题,使jBPM可以方便的在当前所有数据库上移植。
JBOSSjPBMAPI可以从你的项目中任何定制的java软件中访问,例如你的web应用、你的EJB、你的webservice组件、你的消息驱动bean,或者其他java组件。
1.5JBOSSjBPM控制台web应用程序
jBPM控制台web应用程序服务于两个目的。
首先,它作为与由流程执行所产生的运行时任务相交互的一个重要的用户接口;其次,它是一个管理和监控控制台,允许检查和操纵运行时实例。
1.6JBOSSjBPM身份组件
JBOSSjBPM可以与任何包含用户或其他组织信息目录的公司集成,但是对于没有组织信息组件可用的项目,JBOSSjBPM包含了它自己的组件。
身份组件所使用的模型比传统的servlet、ejb和portlet(译者注:
portlet是portal中最重要的组件,与servlet类似,portlet是部署在容器中用来生成动态内容的web组件。
)模型更丰富。
更多信息,请看“11.11身份组件”。
TODO
1.7JBOSSjBPM调度程序
JBOSSjBPM调度程序是一个用来监视和执行定时器的组件,它在流程执行期间被调度。
定时器组件软件被打包进核心的jbpm库,但是它需要被部署进下列环境之一:
要么配置调度程序servlet去产生监视线程,要么用调度程序的main方法启动一个独立的JVM。
1.8JBOSSjBPM数据库兼容包
JBOSSjBPM数据库兼容包是一个包含能使jBPM在你所选择的数据库上运行的所有信息、驱动程序和脚本的下载包。
1.9JBOSSjBPMBPEL扩展
JBOSSjBPMBPEL扩展是一个独立的扩展包,它扩展了jBPM,使之支持BPEL(BusinessProcessExecutionLanguage商业流程执行语言),BPEL本质上是一个xml脚本语言,用来根据其他web服务(webservices)编写web服务(webservices)。
第3章指南
这个指南将向你展示如何用jpdl创建基本的流程以及如何使用API管理运行期的执行。
这个指南的形式是解释一组示例,每个示例集中于一个特殊的主题,并且包含大量的注释,这些例子也可以在jBPM下载包的目录src/java.examples中找到。
最好的学习方法就是建立一个工程,并且通过在给定例子上做不同的变化进行实验。
对eclipse用户来说可以如下方式开始:
下载jbpm-3.0-[version].zip并且解压到自己的系统,然后执行菜单“File”-->“Import…”-->“ExistingProjectintoWorkspace”,然后点击“Next”,浏览找到jBPM根目录,点击“Finish”。
现在,在你的工作区中就有了一个jbpm.3工程,你可以在src/java.examples/…下找到本指南中的例子,当你打开这些例子时,你可以使用菜单“Run”-->“RunAs…”-->“JUnitTest”运行它们。
jBPM包含一个用来创作例子中展示的XML的图形化设计器工具,你可以在“2.1下载概述”中找到这个工具的下载说明,但是完成本指南不需要图形化设计器工具。
3.1HelloWorld示例
一个流程定义就是一个有向图,它由节点和转换组成。
Helloworld流程有三个节点,下面来看一下它们是怎样组装在一起的,我们以一个简单的流程作为开始,不用使用设计器工具,下图展示了helloworld流程的图形化表示:
图3.1helloworld流程图
publicvoidtestHelloWorldProcess(){
//这个方法展示了一个流程定义以及流程定义的执行。
//这个流程定义有3个节点:
一个没有命名的开始状态,
//一个状态“s”,和一个名称为“end”的结束状态。
//下面这行是解析一段xml文本到ProcessDefinition对象(流程定义)。
//ProcessDefinition把一个流程的规格化描述表现为java对象。
ProcessDefinitionprocessDefinition=ProcessDefinition.parseXmlString(
"
"
"
" "+
"
"
" "+
"
""
);
//下面这行是创建一个流程定义的执行。
创建后,流程执行有一个
//主执行路径(=根令牌),它定位在开始状态。
ProcessInstanceprocessInstance=
newProcessInstance(processDefinition);
//创建后,流程执行有一个主执行路径(=根令牌)。
Tokentoken=processInstance.getRootToken();
//创建后,主执行路径被定位在流程定义的开始状态。
assertSame(processDefinition.getStartState(),token.getNode());
//让我们开始流程执行,通过它的默认转换离开开始状态。
token.signal();
//signal方法将会把流程阻塞在一个等待状态。
//流程执行进入第一个等待状态“s”,因此主执行路径现在定位
//在状态“s”。
assertSame(processDefinition.getNode("s"),token.getNode());
//让我们发送另外一个信号,这将通过使用状态“s”的默认转换
//离开状态“s”,恢复流程执行。
token.signal();
//现在signal方法将返回,因为流程示例已经到达结束状态。
assertSame(processDefinition.getNode("end"),token.getNode());
}
3.2数据库示例
jBPM的特性之一就是在流程等待状态时,拥有把流程的执行持久化到数据库中的能力。
下面的例子将向你展示怎样存储一个流程实例到数据库,例子中还会出现上下文。
分开的方法被用来创建不同的用户代码,例如,一段代码在web应用中启动一个流程并且持久化执行到数据库,稍后,由一个消息驱动bean从数据库中加载流程实例并且恢复它的执行。
有关jBPM持久化的更多信息可以在“第7章持久化”找到。
publicclassHelloWorldDbTestextendsTestCase{
staticJbpmConfigurationjbpmConfiguration=null;
static{
//在“src/config.files”可以找到象下面这样的一个示例配置文件。
//典型情况下,配置信息在资源文件“jbpm.cfg.xml”中,但是在这里
//我们通过XML字符串传入配置信息。
//首先我们创建一个静态的JbpmConfiguration。
一个JbpmConfiguration
//可以被系统中所有线程所使用,这也是为什么我们可以把它安全的设置
//为静态的原因。
jbpmConfiguration=JbpmConfiguration.parseXmlString(
"
//jbpm-context机制分离了jbpm核心引擎和来自于外部环境的服务。
"
" " factory='org.jbpm.persistence.db.DbPersistenceServiceFactory'/>"+ " "+ //同样,jbpm使用的所有资源文件在jbpm.cfg.xml中被提供。 " " value='hibernate.cfg.xml'/>"+ " " value='org/jbpm/calendar/jbpm.business.calendar.properties'/>"+ " " value='org/jbpm/graph/def/jbpm.default.modules.properties'/>"+ " " value='org/jbpm/db/hibernate/jbpm.converter.properties'/>"+ " " value='org/jbpm/graph/action/action.types.xml'/>"+ " " value='org/jbpm/graph/node/node.types.xml'/>"+ " " value='org/jbpm/context/exe/jbpm.varmapping.xml'/>"+ "" ); } publicvoidsetUp(){ jbpmConfiguration.createSchema(); } publicvoidtearDown(){ jbpmConfiguration.dropSchema(); } publicvoidtestSimplePersistence(){ //在下面调用的3个方法之间,所有的数据通过数据库被传递。 //在这个测试中,这3个方法被依次执行,因为我们想要测试一个 //完整的流程情景。 但是实际上,这些方法表示了对服务器的不同 //请求。 //因为我们以一个干净的空数据库开始,所以我们首先必须部署流程。 //事实上,这只需要由流程开发者做一次。 deployProcessDefinition(); //假设在一个web应用中当用户提交一个表单时我们起动一个流程 //实例(=流程执行)… processInstanceIsCreatedWhenUserSubmitsWebappForm(); //然后,一个异步消息到达时继续执行。 theProcessInstanceContinuesWhenAnAsyncMessageIsReceived(); } publicvoiddeployProcessDefinition(){ //这个测试展示了一个流程定义以及流程定义的执行。 //这个流程定义有3个节点: 一个没有命名的开始状态, //一个状态“s”,和一个名称为“end”的结束状态。 ProcessDefinitionprocessDefinition=ProcessDefinition.parseXmlString( " " " " "+ " " " "+ " "" ); //查找在上面所配置的pojo持久化上下文创建器。 JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext(); try{ //部署流程定义到数据库中。 jbpmContext.deployProcessDefinition(processDefinition); }finally{ //关闭pojo持久化上下文。 这包含激发(flush)SQL语句把流程 //定义插入到数据库。 jbpmContext.close(); } } publicvoidprocessInstanceIsCreatedWhenUserSubmitsWebappForm(){ //本方法中的代码可以被放在struts的actiong中,或JSF管理 //的bean中。 //查找在上面所配置的pojo持久化上下文创建器。 JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext(); try{ GraphSessiongraphSession=jbpmContext.getGraphSession(); ProcessDefinitionprocessDefinition= graphSession.findLatestProcessDefinition("helloworld"); //使用从数据库中获取的流程定义可以创建一个流程定义的执行 //就象在helloworld例子中那样(该例没有持久化)。 ProcessInstanceprocessInstance= newProcessInstance(processDefinition); Tokentoken=processInstance.getRootToken(); assertEquals("start",token.getNode().getName()); //让我们起动流程执行 token.signal(); //现在流程在状态's'。 assertEquals("s",token.getNode().getName()); //现在流程实例processInstance被存储到数据库, //因此流程执行的当前状态也被存储到数据库。 jbpmContext.save(processInstance); //以后我们可以从数据库再取回流程实例,并且通过提供另外一个 //信号来恢复流程执行。 }finally{ //关闭pojo持久化上下文。 jbpmContext.close(); } } publicvoidtheProcessInstanceContinuesWhenAnAsyncMessageIsReceived(){ //本方法中的代码可以作为消息驱动bean的内容。 //查找在上面所配置的pojo持久化上下文创建器。 JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext(); try{ GraphSessiongraphSession=jbpmContext.getGraphSession(); //首先,我们需要从数据库中取回流程实例。 //有几个可选方法来分辨出我们在这里所要处理的流程实例。 //在这个简单的测试中,最容易的方式是查找整个流程实例列表, //这里它应该只会给我们一个结果。 //首先,让我们查找流程定义。 ProcessDefinitionprocessDefinition= graphSession.findLatestProcessDefinition("helloworld"); //现在我们搜索这个流程定义的所有流程实例。 ListprocessInstances= graphSession.findProcessInstances(processDefinition.getId()); //因为我们知道在这个单元测试中只有一个执行。 //在实际情况中,可以从所到达的信息内容中提取processInstanceId //或者由用户来做选择。 ProcessInstanceprocessInstance= (ProcessInstance)processInstances.get(0); //现在我们可以继续执行。 注意: processInstance将委托信号 //到主执行路径(=根令牌)。 processInstance.signal(); //在这个信号之后,我们知道流程执行应该到达
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深入浅出 jBPM 电子书