監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價咨詢管理系統(tǒng) | 工程設計管理系統(tǒng) | 簽約案例 | 購買價格 | 在線試用 | 手機APP | 產品資料
X 關閉

SOA:BPEL的基本思想

申請免費試用、咨詢電話:400-8352-114

來源:泛普軟件

許多開發(fā)人員覺得BPEL很神秘,不知道到底是什么意思。主要是因為它是根據(jù)很抽象的基于WSDL的Web Service再定義一些抽象執(zhí)行的流程。

其實BPEL一點都不神秘,是一個很簡單的東西。

首先談一下BPEL和WSDL的區(qū)別,WSDL只是定義接口參數(shù),不會定義如何實現(xiàn)接口,而BPEL不僅有自己的接口定義(也是一個WSDL文件,包括輸入?yún)?shù)、方法操作名、返回參數(shù)),BPEL會定義如何調用其他服務的接口來實現(xiàn)自己的接口。簡單地說,BPEL通過流程編程將各種接口組合在一起,其目的在于提供一個“集成了各種接口”的接口。

首先BPEL會有一個起點和終點。

1、它的起點就是“receive”,也就是接收它自己接口的輸入?yún)?shù)。

2、它的終點就是“reply”,也就是得到它自己接口的返回參數(shù)。

整個BPEL就是定義如何通過它的接口輸入?yún)?shù),調用其他外部服務的接口,得到其接口的返回參數(shù)。

它最重要的是兩個定義:

1、一個是賦值命令(Assign/Copy),通過賦值命令將某一變量值賦給所要調用的接口的輸入?yún)?shù)。

2、另一個是調用命令(Invoke),通過Invoke命令來調用外部服務。

另外一個比較重要的就是條件命令(Case Condition),根據(jù)變量的不同來定義各種條件,然后根據(jù)各種條件來調用不同的服務。這些變量可以來自于輸入?yún)?shù),也可以來自于調用外部服務的結果。作為BPEL運行環(huán)境的一個重要功能就是能夠保存并查詢到這些變量。

用Java實例模擬BPEL的創(chuàng)建過程

這里用一個簡單的實例來進一步說明BPEL的基本思想和核心本質,并用Java實例來模擬BPEL的創(chuàng)建過程。

首先假定已經(jīng)有了兩個Web Service,一個為“加法服務”,專門處理兩個數(shù)相加,名為AddService;另外一個為“減法服務”,專門處理兩個數(shù)相減,名為SubtractService。

現(xiàn)在有一個新的需求,需要將上面兩個Web Service集成起來,也就是需要創(chuàng)建一個新的服務,稱為“運算服務”,名為CaculatorService,它有一個運算類型的參數(shù),當運算類型為“加法”時,調用加法服務,當運算類型為“減法”時,調用減法服務。

看到這里,讀者可能會想,直接寫一個Java程序,調用者兩個Web Service不就可以了嗎?筆者的回答是:直接用Java編程當然可以,事實上現(xiàn)在大家就是這么做的。但是Java本質上是一種具體的程序語言,只能運行于JVM的Java運行環(huán)境,不是一種抽象性的通用的標準語言,而BPEL是一種標準化的執(zhí)行語言,如何能夠真正運行BPEL不是它所關心的事情,它還需要各個廠商去開發(fā)自己的BPEL運行環(huán)境,盡管各個廠商所開發(fā)的BPEL的運行環(huán)境可能會不一樣,但是同一個BPEL所開發(fā)的程序,應該可以運行于這些不同的BPEL運行環(huán)境,得到的結果應該是一樣的。就像Web Service的WSDL文件一樣,它只管如何定義服務、服務接口、服務操作、服務參數(shù)等,如何具體實現(xiàn)Web Service不是WSDL所要關心的事情。

下面繼續(xù)前面的實例,兩個Service都會有自己的WSDL定義。下面用實際的Java語言來類似地描述一下,以便于理解。

下面的AddService .java相當于AddService.wsdl(用Java的Interface可能更貼切一點,用Java的class可以說明得更詳細一點)。

Public class AddService{

Public double add(double addParameter1, double addParameter2) {

Double addResposne;

addResposne = addParameter1 +addParameter2;

// WSDL 不會定義具體如何實現(xiàn),

//此處只是說明如何實現(xiàn)操作

Return addResponse;

}

}

下面的SubstractService .java相當SubstractService.wsdl。

Public class SubstractService{

Public double substract(double substractParameter1, double substractParameter2) {

Double substractResposne = substractParameter1 - substractParameter2;

Return substractResposne;

}

}

下面用Java模擬BPEL的創(chuàng)建過程。

首先需要創(chuàng)建BPEL的接口,下面用CaculatorBPELInterface.java來說明,它將有3個參數(shù),其中paramter1和paramter2是需要運算的兩個數(shù),第3個參數(shù)processType表示運算的類型。 Public Interface CaculatorBPELInterface{

Public double caculatorProcess(double parameter1, double parameter2, String processType) ;

}

下面將創(chuàng)建一個Java實現(xiàn)類,說明如何對應于BPEL的創(chuàng)建過程(許多語句(如一些變量定義和賦值定義)對Java來說是不必要的;為了模擬BPEL的創(chuàng)建過程,讓Java開發(fā)人員更好地把握BPEL的創(chuàng)建過程,相應地加入了這些程序語句)。 Public class CaculatorBPELImple implements CaculatorBPELInterface {

Public double caculatorProcess (double parameter1, double parameter2, String processType) {

//步驟1:定義所要調用的外部類(相當于定義BPEL里面partnerLink)

AddService addServer = new AddService();

SubstractService substractSevice = new SubstractService();

/*步驟2:定義輸入和輸出變量(相當于定義BPEL里面變量variable)

定義的變量如下:

● BPEL接口的輸入和輸出變量

● 所要調用的外部類的接口方法的輸入和輸出變量 */

//定義BPEL接口的輸入變量 Double caculatorProcessParameter1Request;

Double caculatorProcessParameter2Request;

Double caculatorProcessTypeRequest;

//定義BPEL接口的輸出變量

Double caculatorProcessResponse;

//定義加法服務的輸入變量

Double addParameter1Request;

Double addParameter2Request;

//定義加法服務的輸出變量

Double addResponse;

//定義減法服務的輸入變量

Double substractParameter1Request;

Double substractParameter2Request;

//定義減法服務的輸出變量

Double substractParameter1Response;

//***將請求參數(shù)賦值給BPEL接口的輸入變量 (相當于BPEL的receive)

caculatorProcessParameter1Request = parameter1;

caculatorProcessParameter2Request= parameter2;

Double caculatorProcessTypeRequest= processType;

//步驟3:定義條件,并調用外部接口

If (caculatorProcessTypeRequest.equals.(“add”’)

// (相當于BPEL的switch/condition/case)

{

//**下面將調用加法服務

//將接口請求變量傳給加法服務的請求變量 (相當于BPEL的assign/copy)

addParameter1Request = caculatorProcessParameter1Request;

addParameter2Request = caculatorProcessParameter2Request;

//調用addService的接口 (相當于BPEL的Invoke)

addResponse = addServer.add(addParameter1Request, addParameter2Request);

//將addResponse賦值給BPEL接口的輸出變量 (相當于BPEL的assign/copy)

caculatorProcessResponse = addResponse;

} else //(相當于BPEL的 condition/otherwise)

{

//將接口請求變量傳給減法服務的請求變量 (相當于BPEL的assign/copy)

substractParameter1Request = caculatorProcessParameter1Request;

substractParameter2Request = caculatorProcessParameter2Request;

//調用substractService的接口 (相當于BPEL的invoke)

substractResponse =

substractServer.substract(substractParameter1Request, substractParameter2Request);

//將substractResponse賦值給BPEL接口的輸出變量(相當于BPEL的assign/copy)

caculatorProcessResponse = substractResponse;

}

Return caculatorProcessResponse; //相當于BPEL的reply

}

}

用實例概述BPEL的創(chuàng)建過程

上面已經(jīng)用Java模擬了BPEL的創(chuàng)建過程。下面將基于同樣的實例,用描述性的WSDL和BPEL來實現(xiàn)其創(chuàng)建過程,使讀者對BPEL能有一個整體性的掌握。

假設已經(jīng)有了前面的加法服務和減法服務的WSDL文件,加法服務為AddService.wsdl,減法服務為Substract.wsdl,它們的主要內容如下所示: AddService.wsdl

|――getRequest (請求消息)

|――addParameter1(double)

|――addParameter2(double)

|――getResponse(返回消息)

|――addResponse(double)

|――addServcie(portType接口)

|――add(operation接口操作)

|――AddService(service 服務名稱)

substractService.wsdl

|――getRequest(請求消息)

|――subtractParameter1(double)

|――subtractParameter2(double)

|――getResponse(返回消息)

|――substractResponse(double)

|――substractService(portType接口)

|――substract(operation接口操作)

|――SubstractService(服務名稱)

下面需要為BPEL創(chuàng)建一個服務接口,caculator.wsdl如下:

caculatorService.wsdl

|――getRequest(請求消息)

|――parameter1(double)

|――parameter2(double)

|――processType (String)

|――getResponse(返回消息)

|――caculatorProcessResponse(double)

|――caculatorService(portType接口)

|――caculatorPorcess(operation接口操作)

|――CaculatorService(service 服務名稱)

下面介紹創(chuàng)建BPEL的基本過程,即caculatorServiceProcess.bpel(下面只是說明BPEL的創(chuàng)建過程,沒有完全按照BPEL的語法,具體的BPEL語法和BPEL編程實例后面會詳細介紹)。

1)創(chuàng)建變量

所定義的變量包括:

1、BPEL接口的輸入和輸出變量。

2、所要調用的外部服務partnerLink的接口操作的輸入和輸出變量。 variable name="request-bpel" messageType采用caculatorService/getRequest

variable name="response-bpel" messageType采用caculatorService/getResponse

 

variable name="request-add" messageType采用addService/getRequest

variable name="response-add" messageType采用addService/getResponse

 

variable name="request-substract" messageType采用substractService/getRequest

variable name="response-substract" messageType采用substractService/getResponse

BPEL定義變量的方式與Java是不一樣的,主要因為BPEL所調用的WSDL是XML語言上面的所定義的變量并不是對應一個具體的值,它實際上對應的是一個數(shù)據(jù)結構。

如caculatorService/getRequest 對應的是caculatorService.wsdl下面的

getRequest

|――parameter1(double)

|――parameter2 (double)

|――processType (String)

也就是說getRequest下面的所有參數(shù)都包含進去了。

2)創(chuàng)建接收

portType=" caculatorService " operation=" caculatorPorcess "

variable=" request-bpel " >

Receive是整個BPEL的起點,所定義的變量request-bpel從服務請求中得到賦值,整個后面的業(yè)務過程將以這個請求變量作為觸發(fā)點。

3)創(chuàng)建條件

程序將根據(jù)不同的條件調用不同的服務,所以先要設立各種條件:

condition="getVariableData('request-bpel','payload','getRequest/processType'>= 'add' >

… 調用加法服務

上面的程序表示在request-bpel的變量中取出路徑為getRequest/ processType所對應的變量值,如果滿足這個值為“add”的條件時,可以在里面加入程序,完成相應的任務。

…… 調用減法服務

如果上面的所有條件都不滿足時,可以在里面加入程序,完成默認的任務。

4)給所要調用的服務的請求變量賦值

為了調用外部服務,先要給外部服務賦值:

上面表示將BPEL過程所收到的初始變量賦給加法服務的請求變量。

5)調用外部服務  portType="addService" operation="add"

inputVariable=" request-add"

outputVariable="response-add" />

上面將會調用加法服務AddSerivce,其中request-add為輸入變量。

6)將服務的結果賦給BPEL的返回變量

在完成了外部服務的調用之后,就可以將外部服務的輸出結果賦給BPEL流程的返回變量。文法同步驟4。

7)調用

調用BPEL的reply命令,將BPEL流程的返回變量返回給服務請求者。 portType=" caculatorService" operation="caculatorPorcess"

variable=" response-bpel" />

這里比較一下步驟2的和步驟6的,可以看到它們的partnerLink的名字、portType的名字、operation的名字都是一樣的。它們是調用的同一個服務下面的同一個接口操作,只是兩個命令的變量不一樣。是收到請求消息的變量值,是將響應變量的結果返回給服務請求者。

事實上,BPEL運行環(huán)境執(zhí)行后,就在等待的返回結果。

上面通過實例介紹了BPEL的基本創(chuàng)建過程,有了這些基本的BPEL整體創(chuàng)建思路后,就可以為更好地理解一些具體的語法打下了基礎。(IT專家網(wǎng))

發(fā)布:2007-04-23 11:32    編輯:泛普軟件 · xiaona    [打印此頁]    [關閉]
相關文章:
南京OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設南路160號1層9號

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務大廈18樓

咨詢:400-8352-114

加微信,免費獲取試用系統(tǒng)

QQ在線咨詢

泛普南京OA快博其他應用

南京OA軟件 南京OA新聞動態(tài) 南京OA信息化 南京OA快博 南京OA行業(yè)資訊 南京軟件開發(fā)公司 南京門禁系統(tǒng) 南京物業(yè)管理軟件 南京倉庫管理軟件 南京餐飲管理軟件 南京網(wǎng)站建設公司