您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > jbpm 工作流架构
1.配置文件(IOC)2.PVM架构2.1.Environment2.2.Service2.3.CommandandCommandService2.4.PVMModels:ProcessDefinition,ActivityBehaviour,Transition,Event2.5.API整体架构图3.PVMModel(模型)解析3.1.ActivityBehaviour(内部节点)3.2.ExternalActivityBehaviour(外部节点)3.3.基本流程的实现3.4.事件机制(EventandEventListener)BibliographyAbstract下面主要是介绍了本工作流组件的基础架构以及应用.1.配置文件(IOC)Abstract配置文件是很关键的一步,同时ConfigurationAPI可以看做是工作流组件的一个入口API,其他很多重要的Service,都是通过这个API生成的.在默认情况下,包里有个jbpm.cfg.xml,这个就是他的配置文件,以下是它的内容:jbpm-configurationimportresource=jbpm.default.cfg.xml/importresource=jbpm.tx.jta.cfg.xml/importresource=jbpm.jpdl.cfg.xml/importresource=jbpm.identity.cfg.xml/importresource=jbpm.jobexecutor.cfg.xml//jbpm-configuration现在再继续看下jbpm.default.cfg.xml配置文件:process-engine-contextrepository-service/repository-cache/execution-service/history-service/management-service/identity-service/task-service/hibernate-configurationcfgresource=jbpm.hibernate.cfg.xml//hibernate-configuration.........../process-engine-contexttransaction-contextrepository-session/db-session/message-session/timer-session/history-session/mail-sessionmail-serversession-propertiesresource=jbpm.mail.properties//mail-server/mail-session/transaction-context这个配置文件主要包含了process-engine-context'和'transaction-context'的配置.现在可以来看下本工作流组件的IOC实现机制.首先是Context接口,可以从这里存储,获得对象.Objectget(Stringkey);TTget(ClassTtype);Objectset(Stringkey,Objectvalue);可以从Context中获取到组件,对于IOC容器来说,一般情况下都会提供一种加载的方式,比如从xml文件进行加载、从资源文件进行加载。该组件是通过WireParser来解析xml,然后创建并把对象存放在WireContext.WireContext这个类负责存放,提取对象,内部用一个Map来存储已经创建的对象实例,可以简单得把他看成是IOC的一个实现类.从WireContext的javadoc,我们可以看出,他主要是跟WireDefinition,Descriptor打交道.WireContext里面包含了一个WireDefinition,而WireDefinition里面包含了一系列的Descriptor.每个Descriptor负责创建和初始化该对象.比如我们可以看到IntegerDescriptor,FloatDescriptor,ObjectDescriptor等等.我们来看下Descriptor的接口:/***constructstheobject.*@paramwireContext{@linkWireContext}inwhichtheobjectiscreated.Thisisalsothe{@linkWireContext}*wheretheobjectwillsearchforotherobjectthatmaybeneededduringtheinitializationphase.*@returntheconstructedobject.*/Objectconstruct(WireContextwireContext);/***calledbytheWireContexttoinitializethespecifiedobject.*/voidinitialize(Objectobject,WireContextwireContext);Descriptor对象的创建可以直接通过Java对象的实例化,比如(newIntegerDescriptor(..)),也可以通过xml的配置文件来实现.可以说我们更经常用xml来配置,所以就有了Binding的概念.Binding类最主要的任务就是把XMLDOM到Java对象的转换.Bindings是把Binding归类了一下而已.以下是Binding的接口.publicinterfaceBinding{StringgetCategory();/**doesthisbindingapplytothegivenelement?*/booleanmatches(Elementelement);/**translatesthegivenelementintoadomainmodeljavaobject.*Usetheparsetoreportproblems.*/Objectparse(Elementelement,Parseparse,Parserparser);}如果想看实现,我们可以看下IdentityServiceBinding,RepositoryServiceBinding等等.这里注意,在该组件的实现中,WireDescriptorBinding是根据tagName来解析的.所以,从它的xml配置文件,到ProcessEngine对象的构建,是这样的一个流程.jbpm.cfg.xml–jBPMConfigurationParser-Binding–Descriptor--WireContext或者更清楚的,我们可以看下下面这张图[1].我们不妨也看下ConfigurationTest测试.publicvoidtestConfigurationServices(){ProcessEngineprocessEngine=newConfiguration().setXmlString(jbpm-configuration+process-engine-context+repository-service/+execution-service/+management-service/+/process-engine-context+/jbpm-configuration).buildProcessEngine();assertNotNull(processEngine);assertNotNull(processEngine.getExecutionService());assertNotNull(processEngine.getManagementService());}Configuration类是入口,你可以从Configuration类中创建ProcessEngine,而从ProcessEngine中获取到RepositoryService,ExecutionService,TaskService等等.Configuration类里有两个实现类,一个是JbpmConfiguration,这是默认组件自带的Configuration解析器,另外一个是SpringConfiguration,这个是本工作流组件和Spring的集成.在这里,我们就只看下JbpmConfiguration的实现,在JbpmConfiguration类里,我们可以看到他是这么去调用Parser来解析xml的.protectedvoidparse(StreamInputstreamSource){isConfigured=true;JbpmConfigurationParser.getInstance().createParse().pushObject(this).setStreamSource(streamSource).execute().checkErrors(jbpmconfiguration+streamSource);}在这里,我们可以看到,该工作流组件的配置文件是有两个元素组成的,一个是process-engine-context,另外一个是transaction-context.其中process-engine-context里面的元素是包括了对外发布的服务,比如repository-service,execution-service等等.而transaction-context则包括了他的内部真正实现,比如repository-service对应repository-session.也可以简单的把repository-servie看做是API,repository-session看做是SPI.这样做的好处是,SPI的实现,对API一点影响都没有,很大程度上提供了一个容易集成的特性.2.PVM架构这里,我们看下PVM概念和架构,这也是整个项目的核心所在.PVM(ProcessVirtualMachine),主要是想作为一个开发平台,在这个平台上,可以很方便的开发工作流,服务编制(orchestration),BPM等等.就比如说jPDL这套语法的内部实现就是基于PVM的.将来基于PVM可以开发一个符合WS-BPEL2.0的模块.PVM可以简单的看成是一个状态机.我们接下去看下里面的几个重要概念.2.1.EnvironmentEnvironment的概念,主要有以下的作用.1.使process能在不同的环境下之行,比如可以在标准的Java,企业级Java,Seam或者Spring环境下运行.2.他可以存放着不同的context对象,比如我们之前所看到的配置文件中的process-engine的Context,transaction的Context等.在代码中,我们想获得其他的组件时,或者变量时,我们总是使用Environment的API,我们可以看下它的API的几个重要方法.publicabstractTTget(ClassTtype);/**searchesanobjectbasedontype.Thesearchdoesntakesuperclassesofthecontextelements*intoaccount.*@returnthefirstobjectofthegiventypeornullincasenosuchelementwasfound.*/publicabstractTTget(ClassTtype,String[]searchOrder);Environment内部是使用Map来保存不同的Context对象,Environment对象的创建主要是有EnvironmentFactory来负责.Env
本文标题:jbpm 工作流架构
链接地址:https://www.777doc.com/doc-5593289 .html