dev2dev 首页 > 资源中心 > 技术文章
BPELJ:BPEL 与 Java 的有机融合
Web服务业务流程执行语言(BPEL)是一种编程语言,它明确定义了基于Web服务的业务流程。BPEL在支持业务伙伴间的长时间会话方面表现尤为卓越。BPEL将成为基于Web服务的业务流程最广泛采用的标准,这一趋势早在该标准正式发布前就已经非常明显。
BPEL适用于支持业务流程逻辑的"宏观编程"。这些业务流程均是完整而独立的应用,它们将Web服务作为实现其业务功能的"活动"。BPEL不致力于成为通用的编程语言,相反,它的应用设想就是与其他实现业务功能("微观编程")的编程语言结合使用。
本技术白皮书提出了将BPEL与Java结合的技术路线,并命名为"BPELJ",此项技术允许同时使用这两种编程语言来构建业务流程应用。通过实现BPEL和Java的协同工作,BPELJ最大限度地发挥了每种语言的长处。
下表列举了BPEL最适合完成的任务类型和业务流程中最适合由Java完成的任务。
|
BPEL
|
Java
|
- 描述业务流程逻辑
- 维护多个可以被中断的长时间执行单元
- 在发生故障的情况下,有选择地补偿长时间执行单元的已完成活动
- 恢复由于错误而遗漏的任务,将任务的重执行率降至最低
- 在正确流程内将输入消息路由到正确地点
- 接受多种可能的预料输入消息类型中的一种
- 定义一系列在指定时间、按照预定顺序发生的活动
- 向Web服务发送消息
|
- 计算要插入到文件中的值
- 采用其他文件和变量的信息,构造发送给Web服务的文件
- 析构已到达文件,找到和转换重要的值,随后将其插入到其他文件中
- 计算影响业务流程中控制流的值(例如循环和分支)
-
- 无须创建Web服务便可实现边缘效应(side-effect)
|
BPELJ允许在BPEL流程定义中引用Java代码片断(称为Java Snippet),从而实现了Java和BPEL的融合。Snippet是Java表达式或小块Java代码,可用于如:循环条件、分支条件、变量初始化、Web服务消息准备和业务功能逻辑等等。为使BPEL和Java能够更为便利地结合,BPELJ对BPEL进行了少量修改和部分扩展(附件列举了针对BPEL的修改)。但是,如果此类修改不被接受,BPELJ将继续延用BPEL的现有特性,尽管这样会对实际应用的便利性有所影响。
BPELJ扩展是通过BPEL标准定义的扩展点引入的,以提供一些全新功能。BPELJ流程可以在任何支持BPEL之BPELJ扩展的平台上执行。需特别注意的是,BPELJ并未要求所有BPELJ流程都需包含某项扩展,因此所有的BPEL流程都是合法的、可执行的BPELJ流程。
除了能够使用Java来完成业务流程中的计算工作,BPELJ还能够使用BPEL来协调J2EE组件间的长时间交互。目前有大量采用Java组件部署的业务逻辑,而BPELJ能够创建同时包括Java组件和Web服务的业务流程。以下图中简单的业务流程为例,在该流程中,白框代表了Web服务调用,灰框代表了Java方法调用。虚线框则代表了包含嵌入式Java
Snippet的活动。接下来我们详细讨论此流程示例。

BPEL 1.1引入了"伙伴连接类型(partner link type)"的概念,以用于在WSDL文件中声明两个协作的业务伙伴彼此希望对方提供的接口。伙伴连接类型使用WSDL的端口类型作为接口定义方法。BPEL流程若要声明其希望参与的长时间会话,可通过定义使用相应类型的伙伴连接来完成。为了使流程在Web服务之外还能够利用Java资源,BPELJ可以创建新的伙伴连接类型,其接口采用Java接口进行定义,而非WSDL接口类型。BPELJ流程中采用此类新伙伴连接类型的伙伴连接被称作Java伙伴连接(Java
partner link)。
Java接口和Web服务端口类型的主要区别之一是:Java接口可以将任意Java对象作为参数,而Web服务只能接受XML。为了更有效的利用Java伙伴连接,流程必须能够提供可作为输入参数传送的Java对象,并且能够接受Java对象作为返回值。BPELJ完全满足了这些要求,在BPEL中除原有的XML
Schema和WSDL消息变量类型之外,BPELJ还可以使用Java接口类型来声明流程变量。BPELJ流程中的snippet可随后创建一个Java实例、将其赋给一个BPELJ变量、在实例中调用大量方法、而后将该对象作为参数传送给由Java伙伴连接提供的方法。随后,作为方法返回值发送的对象在被流程中的其他地方使用之前,可被存储到另一个变量中。
BEPLJ流程的定义可作为一个独立的文件,也可以嵌入到Java文件中,作为Java类的注释。类注释位于类声明代码上方的块注释部分,J2SE
1.5和未来的Java版本有可能为类注释定义明确的语法,以将其从块注释部分摘离出来。当类注释中定义了BPELJ流程时,该类即称为"流程类(process
class)"。流程类的接口没有限制,同样,BPELJ流程的定义也没有相应限制。对于流程类的任意变量,BPELJ流程中的Snippet有权访问该流程类的包可视域和方法。
阅读全文,请下载文档
作者其它文章
|