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

SOA:BPEL的基本思想

申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114

來(lái)源:泛普軟件

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

其實(shí)BPEL一點(diǎn)都不神秘,是一個(gè)很簡(jiǎn)單的東西。

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

首先BPEL會(huì)有一個(gè)起點(diǎn)和終點(diǎn)。

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

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

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

它最重要的是兩個(gè)定義:

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

2、另一個(gè)是調(diào)用命令(Invoke),通過(guò)Invoke命令來(lái)調(diào)用外部服務(wù)。

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

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

這里用一個(gè)簡(jiǎn)單的實(shí)例來(lái)進(jìn)一步說(shuō)明BPEL的基本思想和核心本質(zhì),并用Java實(shí)例來(lái)模擬BPEL的創(chuàng)建過(guò)程。

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

現(xiàn)在有一個(gè)新的需求,需要將上面兩個(gè)Web Service集成起來(lái),也就是需要?jiǎng)?chuàng)建一個(gè)新的服務(wù),稱為“運(yùn)算服務(wù)”,名為CaculatorService,它有一個(gè)運(yùn)算類型的參數(shù),當(dāng)運(yùn)算類型為“加法”時(shí),調(diào)用加法服務(wù),當(dāng)運(yùn)算類型為“減法”時(shí),調(diào)用減法服務(wù)。

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

下面繼續(xù)前面的實(shí)例,兩個(gè)Service都會(huì)有自己的WSDL定義。下面用實(shí)際的Java語(yǔ)言來(lái)類似地描述一下,以便于理解。

下面的AddService .java相當(dāng)于AddService.wsdl(用Java的Interface可能更貼切一點(diǎn),用Java的class可以說(shuō)明得更詳細(xì)一點(diǎn))。

Public class AddService{

Public double add(double addParameter1, double addParameter2) {

Double addResposne;

addResposne = addParameter1 +addParameter2;

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

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

Return addResponse;

}

}

下面的SubstractService .java相當(dāng)SubstractService.wsdl。

Public class SubstractService{

Public double substract(double substractParameter1, double substractParameter2) {

Double substractResposne = substractParameter1 - substractParameter2;

Return substractResposne;

}

}

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

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

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

}

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

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

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

AddService addServer = new AddService();

SubstractService substractSevice = new SubstractService();

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

定義的變量如下:

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

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

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

Double caculatorProcessParameter2Request;

Double caculatorProcessTypeRequest;

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

Double caculatorProcessResponse;

//定義加法服務(wù)的輸入變量

Double addParameter1Request;

Double addParameter2Request;

//定義加法服務(wù)的輸出變量

Double addResponse;

//定義減法服務(wù)的輸入變量

Double substractParameter1Request;

Double substractParameter2Request;

//定義減法服務(wù)的輸出變量

Double substractParameter1Response;

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

caculatorProcessParameter1Request = parameter1;

caculatorProcessParameter2Request= parameter2;

Double caculatorProcessTypeRequest= processType;

//步驟3:定義條件,并調(diào)用外部接口

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

// (相當(dāng)于BPEL的switch/condition/case)

{

//**下面將調(diào)用加法服務(wù)

//將接口請(qǐng)求變量傳給加法服務(wù)的請(qǐng)求變量 (相當(dāng)于BPEL的assign/copy)

addParameter1Request = caculatorProcessParameter1Request;

addParameter2Request = caculatorProcessParameter2Request;

//調(diào)用addService的接口 (相當(dāng)于BPEL的Invoke)

addResponse = addServer.add(addParameter1Request, addParameter2Request);

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

caculatorProcessResponse = addResponse;

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

{

//將接口請(qǐng)求變量傳給減法服務(wù)的請(qǐng)求變量 (相當(dāng)于BPEL的assign/copy)

substractParameter1Request = caculatorProcessParameter1Request;

substractParameter2Request = caculatorProcessParameter2Request;

//調(diào)用substractService的接口 (相當(dāng)于BPEL的invoke)

substractResponse =

substractServer.substract(substractParameter1Request, substractParameter2Request);

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

caculatorProcessResponse = substractResponse;

}

Return caculatorProcessResponse; //相當(dāng)于BPEL的reply

}

}

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

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

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

|――getRequest (請(qǐng)求消息)

|――addParameter1(double)

|――addParameter2(double)

|――getResponse(返回消息)

|――addResponse(double)

|――addServcie(portType接口)

|――add(operation接口操作)

|――AddService(service 服務(wù)名稱)

substractService.wsdl

|――getRequest(請(qǐng)求消息)

|――subtractParameter1(double)

|――subtractParameter2(double)

|――getResponse(返回消息)

|――substractResponse(double)

|――substractService(portType接口)

|――substract(operation接口操作)

|――SubstractService(服務(wù)名稱)

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

caculatorService.wsdl

|――getRequest(請(qǐng)求消息)

|――parameter1(double)

|――parameter2(double)

|――processType (String)

|――getResponse(返回消息)

|――caculatorProcessResponse(double)

|――caculatorService(portType接口)

|――caculatorPorcess(operation接口操作)

|――CaculatorService(service 服務(wù)名稱)

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

1)創(chuàng)建變量

所定義的變量包括:

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

2、所要調(diào)用的外部服務(wù)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是不一樣的,主要因?yàn)锽PEL所調(diào)用的WSDL是XML語(yǔ)言上面的所定義的變量并不是對(duì)應(yīng)一個(gè)具體的值,它實(shí)際上對(duì)應(yīng)的是一個(gè)數(shù)據(jù)結(jié)構(gòu)。

如caculatorService/getRequest 對(duì)應(yīng)的是caculatorService.wsdl下面的

getRequest

|――parameter1(double)

|――parameter2 (double)

|――processType (String)

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

2)創(chuàng)建接收

portType=" caculatorService " operation=" caculatorPorcess "

variable=" request-bpel " >

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

3)創(chuàng)建條件

程序?qū)⒏鶕?jù)不同的條件調(diào)用不同的服務(wù),所以先要設(shè)立各種條件:

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

… 調(diào)用加法服務(wù)

上面的程序表示在request-bpel的變量中取出路徑為getRequest/ processType所對(duì)應(yīng)的變量值,如果滿足這個(gè)值為“add”的條件時(shí),可以在里面加入程序,完成相應(yīng)的任務(wù)。

…… 調(diào)用減法服務(wù)

如果上面的所有條件都不滿足時(shí),可以在里面加入程序,完成默認(rèn)的任務(wù)。

4)給所要調(diào)用的服務(wù)的請(qǐng)求變量賦值

為了調(diào)用外部服務(wù),先要給外部服務(wù)賦值:

上面表示將BPEL過(guò)程所收到的初始變量賦給加法服務(wù)的請(qǐng)求變量。

5)調(diào)用外部服務(wù)  portType="addService" operation="add"

inputVariable=" request-add"

outputVariable="response-add" />

上面將會(huì)調(diào)用加法服務(wù)AddSerivce,其中request-add為輸入變量。

6)將服務(wù)的結(jié)果賦給BPEL的返回變量

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

7)調(diào)用

調(diào)用BPEL的reply命令,將BPEL流程的返回變量返回給服務(wù)請(qǐng)求者。 portType=" caculatorService" operation="caculatorPorcess"

variable=" response-bpel" />

這里比較一下步驟2的和步驟6的,可以看到它們的partnerLink的名字、portType的名字、operation的名字都是一樣的。它們是調(diào)用的同一個(gè)服務(wù)下面的同一個(gè)接口操作,只是兩個(gè)命令的變量不一樣。是收到請(qǐng)求消息的變量值,是將響應(yīng)變量的結(jié)果返回給服務(wù)請(qǐng)求者。

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

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

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

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

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

咨詢:400-8352-114

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

QQ在線咨詢

泛普南京OA快博其他應(yīng)用

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