项目组工作流研究.docx
- 文档编号:24428986
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:14
- 大小:78.05KB
项目组工作流研究.docx
《项目组工作流研究.docx》由会员分享,可在线阅读,更多相关《项目组工作流研究.docx(14页珍藏版)》请在冰豆网上搜索。
项目组工作流研究
项目组工作流研究
------开源产品OBE研究报告
作者:
小贝
2004-2-20
1.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.别的WorkFlowEnactmentService
Interface4用于工作流机之间的协作。
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有pletionstrategy(表示什么情况下activity的状态变为完成),可以通过配置,由实现了strategy算法的类来进行决定。
pletionStrategy算法描述的例子是:
某个workitem完成后,activity是否也自动完成。
1.2.4.participant
participant代表了组织中的实体,这些实体将与工作流机交互(处理workitem)。
这些实体可以是人、机器或者工作流机自己。
在OBE中对于不同种类的participant,有相应的处理(第一次阅读该文档的可以掠过以下内容):
caseParticipantType.HUMAN_INT:
//直接为某个用户名建立一个WorkItem,由该用户登陆系统后手动完成该workitem
caseParticipantType.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.WorkItem
WorkItem代表将要被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规X中的模型的java类。
以下是通过解析xpdl文件来创建对象模型实例的例子:
XPDLParserparser=newDom4JXPDLParser();
Packagep=parser.parse(newFileInputStream("workflow.xpdl"));
进一步解释:
WFMCInterface1规X规定对工作流的定义是通过xpdl来完成的,xpdl是以xml的格式来写的,而OBE要对工作流定义进行处理就必须先解析xpdl并转换为可直接进行操作的java类,而其中一个类Package就代表了一个xpdl中的概念--“包”。
总之xpdl中所定义的模型在OBECore都有相应的类与对应。
2.2.OBEEngine
一旦关于工作流定义的对象树被创建,他们便可在engine中执行了。
以下是执行workflow的例子:
importjava.util.ArrayList;
importorg.obe.engine.WorkflowEngine;
WorkflowEnginewfEngine=newWorkflowEngine();
//addthepackagefromthepreviousexample
wfEngine.addPackage(p);
ArrayListparameters=newArrayList();
ListreturnValues=wfEngine.executeSynch(
"packageID","workflowProcessID",parameters);
2.3.Connectors
XPDL中提供了定义工具的方法,工具就是引擎在运行工作流的过程中可能会调用到的引擎所能实现以外的功能,可以看作是对引擎的扩展。
但是为了在XPDL中不具体规定怎么实现这些工具,在XPDL只描述工具的ID和所需的参数。
具体的工具的实现和工具ID的对应则是在repository中定义。
默认的repository定义在文件BasicToolRepository.xml中。
以后会具体描述怎样配置BasicToolRepository.xml文件。
2.4.OBEServer
OBE引擎的工作方式有两种:
一种是嵌入式,另外一种是以EServer的形式运行。
嵌入方式运行时,客户的进程中直接生成engine的实例,然后engine在客户进程中运行。
而以EServer的形式运行时,客户端程序需通过rmi调用来驱动engine。
至于什么情况下用哪种方式,可参考以下文档:
OBEServer是将OBEEngine封装起来的组件,并以E的方式运行。
以下是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需要定制一些本地的配置,这些配置因各个不同的编译环境而不同,例如OSS和Weblogic的安装目录等。
所以prepare.cmd需要一个命令行参数,即定制用的属性文件名。
可以到obe/custom目录找到定制用的属性文件的例子文件,一般只要修改一下就可用了。
3.3.到obe项目的根目录下运行ant
如果定制用的属性文件正确的话,会产生一个ear文件在obe/build目录,将这个文件部署到OSS或Weblogic中。
4.OBE的使用1(以嵌入方式运行OBE)
4.1.用Jawe写一个简单的流程定义文件
4.2.运行OBEWorklist
出现以下菜单:
Enterchoice:
1)SetClientProtocol
2)Connect
3)Disconnect
4)WorkflowProcesses
5)Worklist
6)SetLoggingLevel
E)PrintLastException
M)Redisplaymenu
Q)Quit
4.3.选择1(SetClientProtocol),设置与Engine的通信协议
出现:
Enterprotocol[local]:
输入local,按回车;
输入q,按回车;回到2.2所示的菜单。
4.4.选择2(Connect),连接Engine
输入q,按回车;回到2.2所示的菜单。
4.5.选择4(ProcessDefinitions),进入以下菜单
Enterchoice:
1)ListProcessDefinitions
2)ChangeProcessDefinitionState
3)ImportPackage
4)UpdatePackage
5)ExportPackage
6)DeletePackage
E)PrintLastException
Q)BacktoMainMenu
4.6.选择3(ImportPackage):
出现:
EnterXPDLfilename:
输入xpdl文件的路径加文件名并按回车,如果倒入成功,按q退出菜单。
4.7.选择WorkflowProcesses,出现以下菜单
Enterchoice:
1)ListProcessDefinitions
2)Create&StartProcessInstance
3)ListProcessInstanceAuditEntries
4)ListProcessInstanceAttributes
5)ShowProcessInstanceAttribute
E)PrintLastException
M)Redisplaymenu
Q)Backtopreviousmenu
4.8.选择2(Create&StartProcessInstance)
出现:
EnterprocessdefinitionID:
输入xpdl文件中流程定义的ID,本文中例子流程的ID为test。
如果创建成功会出现:
Successfullycreatedprocess'test_Wor1'instance#0
Doyouwishtostarttheprocess?
>
输入y表示启动该流程。
输入q,回到主菜单。
选择5(Worklist),出现以下菜单---Worklist---
Enterchoice:
1)ListWorkItemsbyPerformer
2)ListWorkItemsbyParticipant
3)ListWorkItemsbyProcessInstance
4)ListWorkItemAttributes
5)ShowWorkItemAttribute
6)ChangeWorkItemState
7)ExecuteaWorkItem
E)PrintLastException
M)Redisplaymenu
Q)Backtopreviousmenu
这时可对workitem做进一步操作。
5.OBE的使用2(以E方式运行OBE)
如果OBE的ear文件被正确部署,OBE就可运行在E方式了。
可以用obeworklist测试一下。
与上面一种的连接方式不一样的是,连接方式选择rmi,并输入正确的连接url和用户名、密码。
如果连接成功就可以和前一种方式一样做importpackage、startprocess等操作了。
6.配置ToolRepository
为了让OBE可以正确的调用客户程序开发的application(Interface3),必须配置好ToolRepository。
而ToolRepository配置文件所在的目录名config,且均为xml格式。
6.1.写ToolMetaData类
首先要写一个描述用的类(这也是为什么叫做MataData的原因),它将继承org.obe.client.api.repository.ToolMetaData。
以下是一个例子程序:
publicfinalclassDummyToolMetaDataextendsToolMetaData{
staticfinallongserialVersionUID=27L;
privatestaticfinalString_implClass="org.obe.runtime.tool.DummyTool";
privatestaticfinalString[]_implCtorSig={
"java.lang.String",
"int"
};
privateint_execTime;
publicDummyToolMetaData(){
super();
}
publicDummyToolMetaData(Stringid,StringdisplayName,
Stringdescription,StringdocUrl,Stringauthor,intexecTime){
super(_implClass,_implCtorSig,id,displayName,description,docUrl,
author,true);
_execTime=execTime;
}
publicToolMetaDataintrospect(ExternalReferenceextRef,
EntityResolverentityResolver){
returnnull;
}
publicObjectcreateInstance(EntityResolverentityResolver)throwsRepositoryException{
returncreateInstance(newObject[]{_displayName,
newInteger(_execTime)});
}
publicintgetExecTime(){
return_execTime;
}
publicvoidsetExecTime(intexecTime){
_execTime=execTime;
}
}
这个例子没有实现具体的功能,但可以作为演示,表示任何tool都具有这些特征,其他例子可以看包org.obe.client.api.repository中的类。
这个类的一个典型特征是_implClass属性中规定了真正实现了tool的功能的类。
以下是实现功能的类的例子:
publicclassDummyToolextendsAbstractToolAgent{
privatestaticfinalLog_logger=LogFactory.getLog(
DummyTool.class);
privateString_name;
privateint_execTimeMS;
/**
*ConstructsanewDummyToolwiththegivenname.
*Thenamecanbeusedtoidentifythedebuginstanceatruntime.
*TheexecTimeissetto0.
*
*paramnameThedebugname
*/
publicDummyTool(Stringname){
this(name,0);
}
/**
*ConstructsanewDummyToolwiththegivenname.
*Thenamecanbeusedtoidentifythedebuginstanceatruntime.
*TheexecTimeMSattributecanbeusedtospecifyatimethatthe
*debugconnectorshouldexecutetosimulatearealtool
*executing.
*
*paramnameThedebugname
*paramexecTimeMSTheamountoftimeforexecution,inmilliseconds.
*/
publicDummyTool(Stringname,intexecTimeMS){
_name=name;
_execTimeMS=execTimeMS;
}
protectedint_invokeApplication(Parameter[]parameters)
throwsInterruptedException,InvocationTargetException{
StringBufferbuffer=newStringBuffer("Invokingdummytool:
");
buffer.append(_name);
buffer.append('[');
for(inti=0;i buffer.append(parameters[i].actualParmId); buffer.append('='); buffer.append(parameters[i].value); } buffer.append(']'); _logger.debug(buffer.toString()); _logger.debug("Sleepingfor"+_execTimeMS+"milliseconds"); _status=ACTIVE; Thread.sleep(_execTimeMS); return0; } 这个类也有一个典型特征,那就是其_invokeApplication函数,我们只要实现这个函数便可为OBE完成特定功能。 6.2.配置castor-mapping.xml 在该文件中加入类似与以下的内容: extends="org.obe.client.api.repository.ToolMetaData"> 6.3.配置BasicToolFactory.xml 在该文件中加入类似与以下的内容: xsi: type="java: org.obe.client.api.repository.DummyToolMetaData">
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 项目 工作流 研究