Apache ODE流程编译过程解析

流程编译过程包括了两个步骤,一个是流程的部署过程,另一个是编译。在BPEL流程设计完之后,要想使用该流程首先得将流程文件及相关WSDL文件拷贝到特定文件夹中,该文件夹为所有部署流程的放置位置,这样的实现,降低了流程部署的复杂性。引擎通过查看该文件夹来得知是否有新的流程加入到引擎中,如果发现该文件夹中有新的流程部署,则开始解析BPEL文件和相应的部署文件(deploy.xml),该文件对当前所要部署的流程基本信息进行描述,包括流程名称、流程所引用到的WSDL文件等,在解析过程中根据BPEL规范对不同活动的定义来提取BPEL文件中的各个结构信息、变量信息,以此来构建一个在引擎内部交互的BPEL对象,该对象包含了所有BPEL流程相关信息,后续的所有运行操作再不需要其他文件的参与。在没有错误之后,由持久化层将该流程信息进行存储,等待客户端调用。最后,还应该将该BPEL暴露为Web服务,并且提供WSDL文件。



 在引擎启动后,首先会根据引擎所在的容器环境,对流程部署文件夹进行配置,然后启动部署轮询器来每隔固定间隔轮询检查。部署轮询器会首先检查新加的流程文件夹中是否有deploy.xml文件,通过FileFilter来实现该功能,然后再为新部署的流程创建一个标志文件,表示该流程已经部署成功,这里使用一个空文件来表示,例如对于ATM-process/这么一个流程,将为该流程创建一个ATM-process.deployed空文件表示其已经部署,然后再通过log4j[31]提供的FileWatchDog工具类来监控该文件夹,如果发现该文件内容有更新则对该流程进行重新部署。部署轮询器还要负责删除流程,如果用户删除了流程部署文件夹下的流程文件,则需要调用相应的部署工具类来移除该流程。

在检测到有新的流程部署之后,引擎调用ProcessStoreImpl.deploy(File)来部署一个流程。在部署的过程中主要是解析BPEL文件的过程,这就需要对XML文件进行操作,在本项目我们采用Apache Xerces来操作XML文件,通过解析读取BPEL定义文件,从中抽取相应信息,构建BPEL的对象模型,并最终通过序列化对象,将其信息保存为二进制形式。这些功能是由DeploymentUnitDir类封装了BpelC工具类来完成的,其中DeploymentUnitDir代表的是一个部署单元,对应到实际的文件系统就是/processes/文件夹下的某个流程文件夹,而核心功能的实现则通过BpelC类的compile(File bpelFile)方法来实现。在该方法中主要做了两个工作,一是解析流程定义文件,利用Java反射机制生成对应的流程对象;二是利用上一步中生成的流程对象生成该流程所对应的编译后的二进制文件。流程文件的解析可以通过导入相应的Schema文件来简化解析过程,在取得对应的Document对象后便可以根据该Document的根节点的类型来判断需要反射生成的对象类型,对象的构造过程是完全根据流程文档的内容进行的(因为Document对象完全表达了流程文件的内容),流程对象将会保存有该流程的属性和所有其所包含的子元素。而该对象只是一个中间值,通过该对象可以拿到流程的一些属性值,然后再将流程相关的所有信息通过Java持久化机制保存成为一个二进制文件,当然也有与该文件相对应的Java对象,该编译后对象与上面介绍到的流程对象的不同是编译后对象包括了流程对象,还有相关XSD文件,WSDL文件等内容。在流程部署后该编译对象是常驻内存的,它保存有该流程的实例个数,流程的执行只要有该对象的参与便可以取得其他相关信息。而之所以需要序列化该编译对象,是因为引擎停止运行后重启,需要加载已经部署成功的流程,这样就可以反序列化该对象文件便可以重新加载运行了。



 用户通过设计器设计完成流程之后,将流程设计文件交给引擎,而其中的编译过程对于用户来说是透明的,用户希望得到的是可以调用的流程实例,BPEL流程最终展示给外界的还是以Web服务的方式进行的,也就是说用户最终可以通过调用一个Web服务来启动流程的执行。要想让用户使用流程,还需要流程编译的最后一步,就是将该流程暴露为Web服务,等待外部调用,新建Web服务的工作则由AXIS2模块来负责完成。

流程部署过程中,一个流程的状态不断的在发生变化的,最先开始阶段流程是未部署状态,部署成功后是已部署,但还没有激活,激活之后流程就可以等待用户调用了,如果有流程实例生成,那么该流程就是运行态了。针对这样的特点,引入事件机制,根据流程在不同时期的不同状态来触发事件。这样在流程部署成功后,触发流程状态转换事件,而每一个状态的不同肯定是有流程形式上、或者表现上的不同来体现的。而在流程从部署态转换到激活状态就是表现为流程将自己以服务的方式暴露给外界,它通过流程配置信息、服务名称、端口名称等信息创建一个新的Web服务,同时将新创建的Web服务所包含的操作的消息接收器指定到具体的内部消息转换器上,这样在AXIS2接收到用户的调用消息后才会跟引擎连接起来,将消息传递进入引擎内部。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值