项目组工作流研究------开源产品OBE研究报告作者:小贝2004-2-201.OBE中的重要概念1.1.工作流参考模型工作流参考模型是由WFMC提出来的,对工作流管理系统的实现的一个参考模型。以下是该模型的一个结构图:下面分别对各个部件进行解释:1.1.1.WorkFlowEnactmentService这个组件就是OBE要实现的,主要功能是读取工作流定义、根据定义决定工作流的走向、为客户程序提供接口以驱动工作流。俗称工作流机或工作流引擎。1.1.2.ProcessDefinitionTool用于以图形化的方式定义工作流。目前比较成熟的开源编辑工具为Jawe(jawe.objectweb.org),OBE虽然也提供了一个工具,但还没完成。ProcessDefinitionTool与WorkFlowEnactmentService之间的接口也成为Interface1,也就是说通过tool生成的文档,WorkFlowEnactmentService要可以正确读取。1.1.3.WorkFlowClientApplication工作流机的客户端程序。该程序可为最终用户提供一个定制的用于驱动工作流的接口。客户端程序通过Interface2与OBE交互。这是我们需要开发的。1.1.4.InvokedApplications在工作流运作的过程中,可能需要调用工作流机之外的功能,这时可通过定义好的Interface3来完成。这也是我们需要开发的。1.1.5.AdministrationandMonitoringTools用于管理和监视工作流机。在OBE中的实现则是OBEWorklist。1.1.6.别的WorkFlowEnactmentServiceInterface4用于工作流机之间的协作。1.2.XPDL对工作流的定义是以XPDL文档的方式存在的。XPDL是eXtensibleProcessDefinitionLanguage的缩写,且格式为XML的格式。XPDL中定义了一下几个概念:1.2.1.package(包)为了把一些相关的对象组织在一起,XPDL定义了包这个概念。导入流程定义到OBE也是以包为单位的。一个包可定义多个process,participant以及application。而包之间可以互相引用各自定义的对象。1.2.2.process定义完成一个任务的所需过程,例如销售订单处理。工作流的运行也是以process为单位的。一个process由多个activity组成。1.2.3.activity一个activity代表了某件要做的事情。一个活动必须是原子操作,也就是说每一件必须要完成的事都必须定义为activity。Activity可以自动开始也可手动执行。一个Activity可能会产生一个或多个workitem,这些workitem将由participant来处理。一个Activity可以因于所有workitem的完成而自动结束,也可能需要手动来结束。在OBE的实现中,Activity有completionstrategy(表示什么情况下activity的状态变为完成),可以通过配置,由实现了strategy算法的类来进行决定。CompletionStrategy算法描述的例子是:某个workitem完成后,activity是否也自动完成。1.2.4.participantparticipant代表了组织中的实体,这些实体将与工作流机交互(处理workitem)。这些实体可以是人、机器或者工作流机自己。在OBE中对于不同种类的participant,有相应的处理(第一次阅读该文档的可以掠过以下内容):caseParticipantType.HUMAN_INT://直接为某个用户名建立一个WorkItem,由该用户登陆系统后手动完成该workitemcaseParticipantType.ORGANIZATIONAL_UNIT_INT,caseParticipantType.SYSTEM_INT://将为系统用户建立一个workitem,由于是系统用户参与的workitem,该workitem将由工作流机自动完成。caseParticipantType.RESOURCE_INT:caseParticipantType.RESOURCE_SET_INT:caseParticipantType.ROLE_INT://将根据算法解析出多个用户名,然后根据workitem分配策略来决定最终的要分配workitem的用户名列表。而在建立workitem时,为列表中的每个用户名都分别建立一个同样的workitem。1.2.5.WorkItemWorkItem代表将要被participant处理的工作。Participant通过设置workitem的状态(如完成)来控制workitem,这可以通过Interface2来完成。工作流机可能会调用Tool或Application来帮助participant完成某个workitem,这可以通过Interface3来完成。在OBE的实现中,以下是产生WorkItem的算法:如果activity没有设置tool,将产生一个workitem;如果activity设置了tool,则为每个类型为Application的tool产生一个workitem。也就是说当tool的类型为procedure时,不产生workitem,而是由OBE直接执行。1.2.6.ToolorApplication就是指参考模型中的InvokedApplication。OBE使用Connectors来进行XPDL中定义的Application与实际实现的Application进行mapping(映射)。在OBE的实现中,有两种tool。一种是Application,表示由OBE调用但运行在别的JVM上的进程,一种是Procedure,表示由OBE调用但运行在同一JVM上。如前一节所述,Tool的类型对产生workitem有影响。2.OBE的组成部件2.1.OBECore该部件包含了所有相对于WFMCInterface1规范中的模型的java类。以下是通过解析xpdl文件来创建对象模型实例的例子:XPDLParserparser=newDom4JXPDLParser();Packagep=parser.parse(newFileInputStream(workflow.xpdl));进一步解释:WFMCInterface1规范规定对工作流的定义是通过xpdl来完成的,xpdl是以xml的格式来写的,而OBE要对工作流定义进行处理就必须先解析xpdl并转换为可直接进行操作的java类,而其中一个类Package就代表了一个xpdl中的概念--“包”。总之xpdl中所定义的模型在OBECore都有相应的类与对应。2.2.OBEEngine一旦关于工作流定义的对象树被创建,他们便可在engine中执行了。以下是执行workflow的例子:importjava.util.ArrayList;importorg.obe.engine.WorkflowEngine;WorkflowEnginewfEngine=newWorkflowEngine();//addthepackagefromthepreviousexamplewfEngine.addPackage(p);ArrayListparameters=newArrayList();ListreturnValues=wfEngine.executeSynch(packageID,workflowProcessID,parameters);2.3.ConnectorsXPDL中提供了定义工具的方法,工具就是引擎在运行工作流的过程中可能会调用到的引擎所能实现以外的功能,可以看作是对引擎的扩展。但是为了在XPDL中不具体规定怎么实现这些工具,在XPDL只描述工具的ID和所需的参数。具体的工具的实现和工具ID的对应则是在repository中定义。默认的repository定义在文件BasicToolRepository.xml中。以后会具体描述怎样配置BasicToolRepository.xml文件。2.4.OBEServerOBE引擎的工作方式有两种:一种是嵌入式,另外一种是以EJBServer的形式运行。嵌入方式运行时,客户的进程中直接生成engine的实例,然后engine在客户进程中运行。而以EJBServer的形式运行时,客户端程序需通过rmi调用来驱动engine。至于什么情况下用哪种方式,可参考以下文档:OBEServer是将OBEEngine封装起来的组件,并以EJB的方式运行。以下是OBE对OBEServer的描述:TheOBEServerprovidesaJ2EEimplementationwhichcanexecuteworkflowprocessesinareliableandfault-tolerantfashion.2.5.OBEWorklist这是一个提供字符型界面的javaapplication。通过它可以对engine进行所有WAPI规定的操作。他提供了连接engine的几种不同方式:本地,RMI以及XML_RPC。2.6.OBEClient它提供了用于与engine进行通信的几种不同协议的实现。OBEWorklist就是用到了它。OBE目前支持本地,本地j2ee,RMI以及XML-RPC等协议。3.OBE的编译由于OBE还没有release版,所以必须从cvs上先取下source,编译以后才能用OBE。3.1.从cvs中取OBE的源码如图所示配置好cvs,然后checkout名为obe的module即可。3.2.运行prepare.cmd在编译OBE之前,需要先运行prepare.cmd这个批处理文件,因为编译OBE需要定制一些本地的配置,这些配置因各个不同的编译环境而不同,例如JBOSS和Weblogic的安装目录等。所以prepare.cmd需要一个命令行参数,即定制用的属性文件名。可以到obe/custom目录找到定制用的属性文件的例子文件,一般只要修改一下就可用了。3.3.到obe项目的根目录下运行ant如果定制用的属性文件正确的话,会产生一个ear文件在obe/build目录,将这个文件部署到JBOSS或Weblogic中。4.OBE的使用1(以嵌入方式运行OBE)4.1.用Jawe写一个简单的流程定义文件4.2.运行OBEWorklist出现以下菜单:Enterchoice:1)SetClientProtocol2)Connect3)Disconnect4)WorkflowProcesses5)Worklist6)SetLoggingLevelE)PrintLastExceptionM)RedisplaymenuQ)Quit4.3.选择1(SetClientProtocol),设置与Engine的通信协议出现:Enterprotocol[local]:输入local,按回车;输入q,按回车;回到2.2所示的菜单。4.4.选择2(Connect),连接Engine输入q,按回车;回到2.2所示的菜单。4.5.选择4(ProcessDefinitions),进入以下菜单Enterchoice:1)ListProcessDefinitions2)ChangeProcessDefinitionState3)ImportPackage4)UpdatePackage5)ExportPackage6)DeletePackageE)PrintLastExceptionQ)BacktoMainMenu4.6.选择3(ImportPackage):出现:EnterXPDLfilename:输入xpdl文件的路径加文件名并按回车,如果倒入成功,按q退出菜单。4.7.选择WorkflowProcesses,出现以下菜单Enterchoice:1)L