天天看點

了解 Web 服務規範: 第 7 部分:Web 服務業務流程執行語言

開始之前

本教程面向使用 Web 服務建構應用程式的開發人員。随着 Web 服務越來越流行,開發人員常常需要建立用于協調多個 Web 服務的程式,以處理業務流程。本文重點關注于 WS-BPEL,它是一個很重要的标準,為這一問題提供了可靠的解決方案,并且成為開發人員常見的選擇。

為了完成本教程的學習,您應該對簡單對象通路協定 (SOAP) 以及相關的技術(如 WSDL)有基本的了解。要更好地了解這些内容,可以閱讀本系列文章的前五部分教程,特别是第 1 部分和第 2 部分。

關于本系列

本系列教程以假想的報社 Daily Moon 為例;為了提高在競争激烈的環境中的工作效率,其員工将使用各種 Web 服務來建立工作流系統,我們将在此過程中講述各個 Web 服務基本概念。

第 1 部分比較簡單,介紹了 Web 服務背後的基本概念,并示範如何使用 SOAP(以後要讨論的大部分内容的基礎規範)來将 Classifieds Department 連接配接到内容管理系統。

第 2 部分進一步深入介紹了如何使用 Web 服務描述語言(Web Services Description Language,WSDL)定義 Web 服務産生的消息,進而使團隊更友善地建立服務以及連接配接到服務的客戶機。

在第 3 部分中,團隊希望準備一系列服務,并希望能友善地查找這些服務。與此對應,統一描述、發現和內建(Universal Description, Discovery and Integration,UDDI)提供了可用服務的可搜尋注冊中心,以便使自己的服務為其他人所注意。

在第 4 部分中,Daily Moon 的發行人 Rudy 決定報社需要為通路其内部系統的 Web 服務制訂更好的安全過程。

第 5 部分介紹了團隊為了通路這些剛提供了安全保護的服務需要進行哪些更改。

第 6 部分提供了關于建構和驗證可互操作的 Web 服務的内容。報社的員工希望能夠獲得盡可能多的讀者,是以他們決定分析他們的 Web 服務,以確定任何想要使用這些 Web 服務的人都能輕松地使用它們。

第 7 部分将介紹 Web 服務業務流程執行語言 (WS-BPEL),并描述了如何通過協調單個服務,使用該語言建立複雜的應用程式。

回頁首

關于本教程

在 Web 服務教程系列文章的第 7 部分中,我們發現 Daily Moon 的員工努力地建構這樣的應用程式,以使得從客戶那裡接收分類廣告的流程實作自動化。Daily Moon 與某家銀行有業務關系,并且員工很希望擁有接收分類廣告并且自動地将付款存放入到銀行的應用程式。幸運的是,這家與員工有工作聯系的銀行擁有能用于實作這種存款業務的 Web 服務。員工對這一問題進行研究,并且決定嘗試使用 WS-BPEL 以将他們的内部分類廣告 Web 服務與銀行的 Web 服務緊密聯系在一起。有了這兩種服務,員工就可以為想象中的業務流程模組化,并且建構處理它的應用程式。

本教程向您介紹了關于建構用于協調現有的 Web 服務的複雜應用程式的内容。按這種方式組合 Web 服務,您可以快速地使用大量實用工具程式來建構應用程式。Web 服務的特點是易于發現并易于使用,要建構功能強大的新應用程式,很自然地就會與 Web 服務聯系起來。

回頁首

先決條件

本教程中所使用的代碼并不專門針對任何特定的程式設計語言或者環境。本教程提供的示例與本教程系列所使用的示例相同。為了完成這些示例的學習,您需要安裝下面的軟體:

Java 2 Standard Edition 1.4.2 或者更高版本,與您在本教程中建構的服務和客戶機一樣,所有這些工具都是基于 Java 的。

Apache Axis2 version 1.0,Axis2 是一種功能齊全的 SOAP 工具包,它提供了多種 Web 服務 API(包括 SOAP 和 WSDL)的實作。當涉及到 Web 服務的開發時,像 Axis2 這樣的工具包是非常有用的。對于其他程式設計語言和環境,也存在一些功能範圍類似的工具包。Apache 的 Axis 項目有很長的曆史,它起源于一項名為 SOAP4J 的 IBM 項目。

Apache Geronimo 或者另一種應用伺服器,本系列教程中使用了 Apache Geronimo J2EE 伺服器(即 IBM WebSphere® Community Edition 伺服器的基礎)。您可以使用其他應用伺服器來代替,但 Geronimo 是一種簡單的、輕量級的、并且可以免費獲得的應用伺服器,是以對于迅速建構和運作,它是一個很好的選擇。

BPWS4J version 2.1,這是 IBM 提供的 BPEL 運作時,它使得您能夠運作使用 WS-BPEL 所編寫的流程。BPWS4J 的試用期為 90 天。

概述

本教程以業務流程的概述和業務流程執行方面重要技術發展作為開始。

了解當今的業務計算

大多數業務應用程式的存在都是為了簡化曾經通過墨水、紙張和人力來完成的處理過程,或者使這一處理過程實作自動化。以前,會計師手工進行計算,使用筆和紙将計算結果記錄在分類帳目中,并且頻繁地往返于銀行。而經紀人則每天重複着一些相似的且單調乏味的任務,銀行家、保險精算師、架構師和工程師也都是如此。計算機的應用一直對業務有很大的影響。許多公司采用了 Web 服務,并且日趨成熟,這成為了數十年來科技進步的巅峰時期。許多重要的基礎機構(如銀行),正在為他們的合作夥伴提供 Web 服務,而合作夥伴可以利用這些 Web 服務,比以往任何時候都更加緊密和有效地組合他們的業務。

每次當您在網上購物時,這種機構組織之間的密切協作的優勢就非常明顯。顯然,業務計算在未來将持續發展。為合作夥伴提供可用的業務,這将獲得更大的成功機會,因為這些業務是合作夥伴的業務流程中重要的組成部分。在業務方面,這并不是一個全新的觀念,但是軟體功能的發展使得人們現在可以快速地實作新的業務,以完成過去單調乏味的工作。

處理颠覆性的技術

要跟上計算機技術的前進步伐并不容易。軟體領域似乎每天都在發生着變化。要想編寫最新的 Web 服務,軟體開發人員需要了解很多相關内容,這主要是因為基礎技術變化得太快。Internet 是最近的颠覆性技術,它向所有類型的業務提出了挑戰。

技術的飛速發展有助于應用最新的 Web 服務,而這些 Web 服務使用與語言無關的 XML 進行定義,并且重點關注于消息,而無需進行更多的假設或規定。這種方法可以将應用程式與 Internet 軟體開發人員所面臨的不斷變化隔離開來。

Web 服務開發人員能夠通過 Web 服務描述隐藏具體的實作,并且可以按照需要對其進行更改。Web 服務的使用者依靠 Web 服務描述以将它們從服務實作的更改中隔離開來。在大多數情況下,您并不知道(或者不需要知道)所使用的服務是如何建構的。

随着 Web 服務越來越流行,最終您将發現,服務的建構和使用将出現在相同的應用程式中。如今常見的聯機存儲便是一個很好的佐證。如果您正在建構像 Daily Moon 分類服務那樣的 Web 服務,那麼您可以從希望購買分類廣告的個人那裡接收相關資訊。如果這個廣告請求中包含付款資訊,那麼可以交給銀行 Web 服務來進行處理。近來十分流行通過組合 其他有價值的服務來建構服務。

對于使用現有的 Web 服務以處理重要業務流程的應用程式,使用某種方法對其進行描述是非常有用的。如果這種用于描述服務的方法是與語言無關的,并且能夠對應用程式進行擴充以使 Web 服務為其使用者和實作者提供相同的優點,那麼将更為合适。

本教程介紹了 Web 服務業務流程執行語言 (WS-BPEL),該語言提供一種與語言無關的工具,以便通過組合現有的 Web 服務來建構新的 Web 服務。

回頁首

已完成的工作

本系列教程逐漸說明了虛構的 Daily Moon 報社的員工将其日常操作更改為基于 Web 服務的系統的過程。在第 1 部分中,Classifieds Department 通過與内容管理系統互動了解了 SOAP 的相關資訊,在第 2 部分中,他們建立了自己的服務,并使用 Web 服務描述語言 (WSDL) 對其進行描述。然後,在第 3 部分,他們了解了如何與 UDDI 注冊中心互動,并了解了如何在其中查找資料,而這最終使他們為自己的公司建立了一個注冊中心,以支援其他組織與 Daily Moon 進行互動。在第 4 部分中,由于 Rudy 堅持要求他的同僚 Gene 和 Francis 提供防止系統非授權通路的方法,是以 Gene 和 Francis 必須為其 Web 服務實作 WS-Security。在第 5 部分中,Rudy 意識到他需要為 Web 服務定義相應的規則,以強制客戶按照規定的方式通路 Daily Moon 的 Web 服務,進而確定在本系列文章第 4 部分中建構的安全體系。在第 6 部分中,Phil 確定了 WSDL 文檔和它所描述的分類 Web 服務與其他 Web 服務之間具有可互操作性。

現在繼續這個有關 Daily Moon 員工的例子,本教程描述了這些員工嘗試建構一個 Web 服務,以使得報社内分類廣告購買的流程實作自動化。本教程向您介紹了 WS-BPEL 以及業務流程模組化中的重要概念。

互操作性概述

在深入介紹 WS-BPEL 細節内容之前,本文将引導您按照業務流程的方式進行思考。然後,本文将介紹 WS-BPEL,并讨論組合 Web 服務以建構新的應用程式的方法。您将了解 WS-BPEL 如何使用 Web 服務标準來完成這一工作,而您已經在使用假想的 Daily Moon報社作為示例的系列教程中學習了這些 Web 服務标準。

了解目标

每當您在進行一項工作時,您都是在執行一個流程。無論您是在對收藏的 DVD 進行排序、種植一棵新樹、或者運輸包裹,都可以通過辨別參與者、他們的活動、以及在這一過程中使用的構件來描述您所執行的流程。

在業務領域中,出于多方面的原因,了解流程是很重要的。首要且顯而易見的原因是,了解業務流程有助于改善這些流程、節約時間和資金。業務分析師堅持不懈地仔細檢查業務流程,尋找提高效率和節約成本的方法。了解業務流程的另一個重要原因是,這些流程常常是重要的知識資産。許多公司能夠取得成功,正是由于他們出衆的知識,而不是任何有形資産或産品。對于這些組織而言,為其流程編寫目錄以便能夠了解、改善和保護這些流程,這是非常重要的。

有必要學習更多關于業務流程以及如何對其進行模組化的内容,如以下部分所示。

了解曆史

按照業務流程的方式進行思考,這并不是一個全新的觀念。企業必須能夠處理日常的管理工作,并考慮如何去完成這些工作,以便維持業務的開展并變得更加高效。如今,企業将注意力集中于如何描述所使用的流程、如何設計新的業務流程、如何執行每個流程、以及如何為以後的深入研究收集有關業務流程的資訊。

軟體對于業務流程驅動的觀點有很大的影響。大多數業務軟體存在的目的是使得以前靠手工完成的流程實作自動化。軟體已經從最初的電子表格和字處理軟體發展為精心設計的客戶關系管理軟體和面向服務的體系結構。随着軟體技術的發展,越來越多的業務流程已經可以實作完全的動化。

因為 Web 服務的廣泛采用,是以可以考慮為跨 Web 服務的業務流程實作自動化。例如,某個公司可能擁有自動化訂單處理系統、計費系統和執行系統,所有這些系統都提供了 Web 服務接口。有了這些 Web 服務,就能夠建構一個應用程式以便使得它們之間的互動實作自動化;例如,可以自動地從客戶那裡接受并完成一項訂單。通過這種方式,Web 服務已經成為用于內建企業應用程式的一項重要技術。

可以使用相同的方法來建構應用程式,這些應用程式依賴于不同的組織所擁有和運作的應用程式。現在,Web 服務為最新的跨企業的業務流程應用程式提供了一個很好的平台。

回頁首

探索業務流程管理

現在,業務流程管理是設計、部署和使用各種标準技術監視業務流程的規範。現在的業務流程管理在很大程度上與 Web 服務和本系列教程中所介紹的技術體系有關,這并不足為奇。

業務流程管理領域中最大的進步之一是,描述業務流程的标準方式的建立。最初,如果某個組織需要建構運作業務流程的軟體,那麼可以使用 Java 或者另一種程式設計語言來完成。現在,可以通過描述業務流程的标準技術來實作。還有一些用于執行業務流程(來自标準化的描述)的運作時環境。

接下來的部分描述了與業務流程管理相關的主要活動,以及一些用于描述和執行重要的業務邏輯的工具。

回頁首

發現和設計流程

作為一名軟體專業人員,您一定曾參加過這樣的會議,其中一位專家竭盡全力地描述某個應用程式将如何工作。通常,他會在白闆上繪制相關的圖表,辨別所有的重要參與者、活動以及業務流程所涉及到的各種構件。這些圖形細化為開發人員詢問的問題和所展示的假想場景。

業務流程設計是一個反複的過程,是以通過某些方式記下流程并且對其進行存儲,以便以後能夠再次調用它以進行改進,這一點是非常重要的。業務需求可能随時間發生更改,是以擁有業務流程存儲庫以及用于檢視和更改它們的标準工具是非常重要的。目前已經存在這樣的工具。WS-BPEL 是一種用于編寫業務流程的重要工具,以便我們能夠檢視、更新和執行這些業務流程。

回頁首

執行流程

在定義了業務流程之後,就可以建構執行它們的軟體系統。可以将使用 WS-BPEL 編寫的業務流程作為腳本,應用于業務流程管理應用程式并加以執行。這種方法有很多優點,其中最大的優點就是,使用它可以簡化建立和更新業務流程的工作。WS-BPEL 是一種用于從現有的 Web 服務建構應用程式的腳本語言。服務描述本身是可執行的腳本,其中描述了 WS-BPEL 運作時環境能夠執行的流程流。

回頁首

監視

在使用标準的語言将業務流程編寫到腳本中,并在業務流程管理應用程式中加以執行之後,就可以很容易地對其進行監控了。這種監控方式能夠為應用程式所執行的每個業務流程執行個體提供大量的報告資訊。例如,您可以要求流程管理應用程式提供有關正在進行處理的目前流程和已經完成的流程的狀态。您可以使用業務流程應用程式來收集相關的資訊,以便能夠輕松地解答許多業務問題,如果不使用這種方法,您将很難找到這些業務問題的答案。

WS-BPEL 介紹

使用正式和标準的語言來描述業務流程,這個觀念由來已久。到目前為止,有許多可用于完成此項任務的競争性标準,包括 IBM 的 Web 服務流語言 (WSFL)、Microsoft 的 XLANG、以及許多其他标準。最後,結合 WSFL 和 XLANG 的優點而建立了 WS-BPEL。在這類标準中,它已成為最流行的标準。

概述

WS-BPEL 依賴于各種各樣的标準技術,您或許已經很熟悉這些技術,具體包括:

  • WSDL
  • XML 模式
  • Xpath
  • Web 服務尋址

WSDL 是這些标準中最為重要的,因為 WS-BPEL 将業務流程描述為 Web 服務間的會話,而這些 Web 服務使用 WSDL 進行描述。此外,WS-BPEL 流程是 WSDL 描述的 Web 服務。

學習這種語言

WS-BPEL 是一種 XML 程式設計語言。在 WS-BPEL 中,可以在業務流程執行環境所執行的 XML 文檔中對業務流程進行描述。WS-BPEL 中的一個流程可以分解為一系列稱作活動 的操作步驟。所支援的活動的清單如下所示。

  • invoke

    ——在現有的 Web 服務上調用一項操作
  • receive

    ——等待來自外部實體的消息
  • reply

    ——産生一條應答外部實體的消息
  • wait

    ——等待一段指定的時間
  • assign

    ——将一個值從源複制到目标
  • throw

    ——引發一個錯誤
  • terminate

    ——無條件地中止目前流程
  • empty

    ——提供一個 no-op 占位符

可以使用一組附加的語言關鍵字,對這些基本活動進行組合,以描述業務流程算法。這些關鍵字提供了 WS-BPEL 語言的結構特性,下面分别列出了這些關鍵字。

  • sequence

    ——定義一組操作的有序序列
  • switch

    ——提供選擇語句,其工作方式類似于 Java 和 C++ 中的 

    case

  • while

    ——定義一個 

    while

     循環
  • pick

    ——提供選擇語句,其工作方式類似于 

    if

  • flow

    ——封裝一組應該并行執行的操作步驟

使用這組關鍵字,您可以想象到應該如何在 WS-BPEL 中表示業務流程。您将發現,這種簡明文法的功能非常強大,并且易于使用。

流程組合模型

如前所述,可以通過辨別參與者、活動、以及其中所涉及的構件來描述業務流程。Web 服務可以是業務流程中的參與者。通常,多個 Web 服務共同協作,以實作一個單獨的業務流程。

将流程定義為服務

當您使用 WS-BPEL 定義業務流程,并将其應用于 WS-BPEL 運作時環境中時,您的業務流程将作為自帶 WSDL 文檔的 Web 服務公開,并根據您的設計方案做好了運作的準備。您的流程定義或許規定了一個或多個與其他 Web 服務的會話,WS-BPEL 使您能夠通過組合各種已有的合作夥伴服務,進而高效地建立新的 Web 服務。這是一種建構應用程式的功能強大的方法,特别是在當您的 WS-BPEL Web 服務本身可能用作另一個業務流程的元件的情況下。

從簡單的英語開始

作為一個示例,請看 Daily Moon。請記住,這個報社正嘗試建構完全自動化的服務,以便處理讀者所建立的新的分類廣告。Daily Moon 的員工已經建構了自己的 Web 服務用于建立分類廣告。現在,員工有了從銀行那裡獲得的描述 Web 服務的 WSDL,他們可以使用這個 Web 服務為使用者所建立的每個分類廣告存放支付款。他們使用簡單的英國文本來描述其流程,并以此作為開始。

  • 最終使用者應用程式使用有關建立分類廣告和對分類廣告進行支付的資訊來調用 Daily Moon。
  • 将所提供的支付資訊送出給銀行進行處理。
    • 如果銀行準許了該付款,那麼再調用分類廣告服務以處理所請求的分類廣告。在建立了分類廣告之後,會向調用者發送一條成功的消息。
    • 如果銀行拒絕了該付款,那麼将不再進行後續的處理。在這種情況下,會向調用者發送相應的消息以告知他支付失敗。

回頁首

使用 WSDL

首先建構用以描述最終将公開的端點的 WSDL,而終端使用者将調用這個端點以實作對您的業務流程的調用。要建立這個 WSDL,首先定義為實作 Daily Moon 分類處理而使用的不同的消息類型。對于這個示例,其中定義了:

  1. 用于與分類服務進行通信的消息 (

    classifiedMessage

    )
  2. 用于與銀行服務進行通信的消息 (

    bankMessage

    )
  3. 使用者用于啟動業務流程的消息 (

    classifiedInfoMessage

    )
  4. 在業務流程處理期間碰到錯誤時所使用的消息。

清單 1 顯示了包括這些消息的 WSDL 定義。

清單 1. 帶有用于 Daily Moon 業務流程消息定義的 WSDL

<definitions targetNamespace="http://tempuri.org/services/classifieddefinitions"             xmlns:tns="http://tempuri.org/services/classifieddefinitions"             xmlns:xsd="http://www.w3.org/2001/XMLSchema"             xmlns="http://schemas.xmlsoap.org/wsdl/"><message name="classifiedMessage">  <part name="classifiedName" type="xsd:string"/>   <part name="amount" type="xsd:int"/></message><message name="bankMessage">    <part name="userName" type="xsd:string"/>    <part name="amount" type="xsd:int"/></message><message name="classifiedInfoMessage">    <part name="classifiedName" type="xsd:string"/>    <part name="userName" type="xsd:string"/>    <part name="amount" type="xsd:int"/></message><message name="classifiedErrorMessage">    <part name="errorCode" type="xsd:int"/></message></definitions>
      

然後,與分類和銀行服務的定義一起,将這組 WSDL 消息定義導入到另一個 WSDL 文檔中。清單 2 中顯示了結果 WSDL。

清單 2. 導入消息定義和分類以及銀行 Web 服務的 WSDL 的父 WSDL

<definitions       targetNamespace="http://tempuri.org/services/wsdl/classified-approval"      xmlns="http://schemas.xmlsoap.org/wsdl/"      xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"            xmlns:xsd="http://www.w3.org/2001/XMLSchema"      xmlns:lns="http://tempuri.org/services/wsdl/classified-approval"      xmlns:asns="http://tempuri.org/services/classifiedservice"      xmlns:apns="http://tempuri.org/services/bankservice"      xmlns:loandef="http://tempuri.org/services/classifieddefinitions">  <import namespace="http://tempuri.org/services/classifiedservice" location="http://localhost:8080/myservices/service/classifiedservice.wsdl"/>  <import namespace="http://tempuri.org/services/bankservice" location="http://localhost:8080/myservices/service/bankservice.wsdl"/>  <import namespace="http://tempuri.org/services/classifieddefinitions" location="http://localhost:8080/myservices/service/classifieddefinitions.wsdl"/>    <plnk:partnerLinkType name="bankLinkType">    <plnk:role name="bank">      <plnk:portType name="apns:bankPT"/>    </plnk:role>  </plnk:partnerLinkType>  <plnk:partnerLinkType name="classifiedLinkType">    <plnk:role name="classified">      <plnk:portType name="asns:classifiedPT"/>    </plnk:role>  </plnk:partnerLinkType>  <!-- The service name and the TNS represent my service ID QName -->  <service name="bookClassifiedServiceBP"/></definitions>
      

在 WS-BPEL 中,将流程中所涉及的所有 Web 服務稱為合作夥伴 Web 服務。在清單 2 中,您可以看到 WSDL partnerLinkType 的定義,用以辨別兩個合作夥伴:銀行 和分類 服務,以及如何将它們連接配接到各自的端口類型,在 WSDL 文檔中對這些端口類型進行了定義。清單 2 中的最後一項内容是為我們的業務流程指定一個服務名稱。

回頁首

定義 BPEL

現在您已經完成了 WSDL,下面将進行 BPEL 定義。您正在實作的業務流程描述了兩個現有的 Web 服務之間的協調。下面需要完成的工作是,按照特定的順序來調用所涉及到的每個服務,并且傳遞它們産生的消息。現在,可以使用您最喜愛的程式設計語言來實作這個邏輯流。學習到這裡,您已經了解編寫這樣的 Java 程式其實是非常容易的。

WS-BPEL 為實作您的業務流程算法提供了一種非常具有吸引力的選擇。WS-BPEL 可以作為腳本語言,用于協調一系列 Web 服務。您不僅可以将合适的 Web 服務調用編寫為腳本,還可以将結果腳本公開為 Web 服務本身,而完成這些操作隻需要進行很少的工作。另外,與用于完成相同任務的程式設計代碼相比,作為一種 XML 語言,WS-BPEL 流程定義更容易更改、更加簡明、更易于了解。

回頁首

組織文檔的結構

BPEL 流程定義于 

<process>

 元素之中。首先将這個元素添加到您的檔案中,如清單 3 所示。

清單 3. BPEL 描述的主要元素

<process name="bookClassifiedProcess"><!-- Definition goes here --></process>
      

流程元素中包含三個主要部分。

建立 BPEL 定義中的第一個部分

第一個部分列出了參與該業務流程的合作夥伴。對于 Daily Moon 示例,具體包括:

  • 分類廣告 Web 服務
  • 銀行 Web 服務
  • 啟動業務流程的最終使用者

清單 4 顯示了 Daily Moon 業務流程的相關合作夥伴聲明。出于可讀性的原因,其中删除了命名空間的定義。

清單 4. 帶有合作夥伴連結的流程描述

<partnerLinks>  <partnerLink name="customer"            partnerLinkType="lns:bankLinkType"           myRole="bank"/>  <partnerLink name="bank"            partnerLinkType="lns:bankLinkType"           partnerRole="bank"/>  <partnerLink name="classified"            partnerLinkType="lns:bookLinkType"           partnerRole="classified"/></partnerLinks>
      

第一個合作夥伴對應于發起這項業務流程的客戶。第二個合作夥伴是銀行 Web 服務。第三個合作夥伴是分類 Web 服務。

建立 BPEL 定義中的第二個部分

BPEL 定義中的第二個主要部分建立了一些占位符,在業務流程的執行期間,這些占位符用于合作夥伴之間生成和傳遞的消息。對于Daily Moon 示例,其中所涉及到的消息包括:

  • 啟動業務流程的原始消息,它稱為 

    request

     消息。
  • 發送到銀行服務以處理支付的消息,它稱為 

    bankMessage

     消息。
  • 銀行服務用于進行響應的消息,它稱為 

    bankapprovalInfo

     消息。
  • (可能)發送給分類服務的消息,它稱為 

    classifiedMessage

     消息。
  • 分類服務用于進行響應的消息,它稱為 

    approvalInfo

     消息。
  • 在業務流程執行期間碰到錯誤時的錯誤消息,它稱為 

    error

     消息。

清單 5 顯示了 BPEL 描述中的變量定義。在每個示例中,都提供了一個符号名稱和一個 WSDL 消息類型。

清單 5. 用于保留業務流程中相關消息的變量定義

<variables>  <variable name="request" messageType="classifieddef:classifiedInfoMessage"/>  <variable name="classifiedMessage" messageType="classifieddef:classifiedMessage"/>  <variable name="bankMessage" messageType="classifieddef:bankMessage"/>  <variable name="approvalInfo" messageType="apns:approvalMessage"/>  <variable name="bankapprovalInfo" messageType="asns:approvalMessage"/>  <variable name="error" messageType="classifieddef:classifiedErrorMessage"/></variables>
      

建立 BPEL 定義中的第三個部分

BPEL 定義中的第三個主要部分用于描述業務流程算法。該算法使用前面介紹過的 BPEL 語言的活動和結構元件來表示。

對業務流程算法進行轉換的工作非常簡單。您将按特定的順序執行一個步驟序列,是以下面以清單 6 所顯示的序列元素開始。大多數業務流程都模組化為序列。

清單 6. 模組化為活動序列的業務流程

<sequence><!-- Do something interesting --> </sequence>
      

根據您的算法,第一個活動是從客戶那裡接受或者接收一個請求。可以使用 

<receive>

 元素來表示這項活動,如清單 7 所示。

清單 7. 顯示接收一條客戶消息的序列

<sequence>  <receive name="receive1"        partnerLink="customer"         portType="asns:bankPT"         operation="depositToBank"        variable="request"        createInstance="yes">  </receive><!-- Do something interesting --> </sequence>
      

這個接收活動中重要的部分是,确定您從哪個合作夥伴那裡接收消息,以及您将接收到的消息存儲到哪個變量中。從本質上講,這個聲明表示“等待在端口類型 BankPT 上調用 depositToBank,并且當這種情況發生時,在變量 

request

 中存儲消息”。

接下來需要做的事情是,從請求消息中将資訊複制到将要使用的一些其他消息中。清單 8 顯示了用于完成這項任務的一系列指派活動。

清單 8. 從一個消息中将狀态資訊複制到另一個消息的指派活動

<assign name="assignclassified">   <copy>      <from variable="request" part="classifiedName"/>      <to variable="classifiedMessage" part="classifiedName"/>   </copy>      <copy>      <from variable="request" part="amount"/>      <to variable="classifiedMessage" part="amount"/>   </copy></assign><assign name="assignbank">   <copy>      <from variable="request" part="userName"/>      <to variable="bankMessage" part="userName"/>   </copy>   <copy>      <from variable="request" part="amount"/>      <to variable="bankMessage" part="amount"/>   </copy></assign>
      

通過從初始請求中複制 

classifiedName

amount

 和 

userName

 資訊,上述的指派活動準備好了 

classifiedMessage

 和 

bankMessage

現在您已經準備好調用銀行 Web 服務,以便處理來自客戶的付款。清單 9 顯示了對銀行 Web 服務的調用活動的定義。

清單 9. 規定了對銀行 Web 服務調用的調用活動

<invoke name="invokeBank"        partnerLink="bank"         portType="asns:bankPT"         operation="depositToBank"        inputVariable="bankMessage"          outputVariable="bankapprovalInfo"></invoke>
      

這項工作很容易了解。它簡單地将 bankMessage 發送到 

bankPT

 并調用 

depositToBank

 操作,同時在 

bankapprovalInfo

 中存儲響應。

下一步操作依賴于上述的 

invokeBank

 活動的結果。我們使用一個 switch 語句以處理條件邏輯和一個稱為 

getVariableData

 的特殊 BPEL 函數,以便檢查銀行準許消息的狀态。清單 10 顯示了這個對可能的結果進行處理的 switch 語句。

清單 10. 用以處理成功或失敗銀行事務的 

switch

 語句

<switch>  <case condition="bpws:getVariableData('bankapprovalInfo','accept')=1">    <invoke name="invokeClassified"            partnerLink="classified"             portType="apns:classifiedPT"             operation="bookClassified"            inputVariable="classifiedMessage"              outputVariable="approvalInfo">    </invoke>  </case>  <otherwise>    <assign name="assignMessage">      <copy>        <from expression="'Bank payment failed'"/>        <to variable="approvalInfo" part="accept"/>      </copy>    </assign>  </otherwise></switch>
      

請注意,如果銀行的處理不成功,那麼清單 10 中的 switch 語句将在 

approvalInfo

 消息中放置一個錯誤字元串。

剩下的工作就是對該客戶作出響應。如清單 11 所示,這項工作是非常簡單的。能夠對該客戶作出響應是為什麼将客戶作為合作夥伴列出的一個原因。更複雜的使用場景(涉及回調)是将流程發起人作為合作夥伴列出的另一個重要原因。

清單 11. 發送應答消息給客戶以通知業務流程成功完成的應答活動

<reply name="reply"       partnerLink="customer"       portType="asns:bankPT"       operation="depositToBank"       variable="approvalInfo"></reply>
      

唯一的附加項目是錯誤處理程式,該錯誤處理程式說明了當 Web 服務調用産生錯誤時 BPEL 如何進行應對。清單 12 顯示了用于處理分類服務引發的錯誤的錯誤處理程式的定義。如果碰到這樣的錯誤,該錯誤程式将立即發送一條錯誤消息給客戶。

清單 12. 錯誤處理程式的定義,其中規定了在産生錯誤時終止流程執行

<faultHandlers>  <catch faultName="classifiedFault"          faultVariable="error">    <reply partnerLink="customer"           portType="apns:bankPT"            operation="depositToBank"           variable="error"            faultName="invalidRequest"/>  </catch></faultHandlers>
      

清單 13 顯示了完整的 BPEL 檔案,該檔案實作了 Daily Moon 的業務流程,以便自動地接收分類廣告,并向客戶收取使用他們所提供的分類 Web 服務和銀行所提供的 Web 服務的費用。

清單 13. 完整的 BPEL 流程定義

<process name="bookClassifiedProcess"         targetNamespace="http://tempuri.org/classifiedProcess"         suppressJoinFailure="yes"         xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/"         xmlns:lns="http://tempuri.org/services/wsdl/classified-approval"         xmlns:classifieddef="http://tempuri.org/services/classifieddefinitions"          xmlns:asns="http://tempuri.org/services/bankservice"         xmlns:apns="http://tempuri.org/services/classifiedservice">  <variables>    <variable name="request" messageType="classifieddef:classifiedInfoMessage"/>    <variable name="classifiedMessage" messageType="classifieddef:classifiedMessage"/>    <variable name="bankMessage" messageType="classifieddef:bankMessage"/>    <variable name="approvalInfo" messageType="apns:approvalMessage"/>    <variable name="bankapprovalInfo" messageType="asns:approvalMessage"/>    <variable name="error" messageType="classifieddef:classifiedErrorMessage"/>  </variables>  <partnerLinks>    <partnerLink name="customer"                  partnerLinkType="lns:bankLinkType"                 myRole="bank"/>    <partnerLink name="bank"                  partnerLinkType="lns:bankLinkType"                 partnerRole="bank"/>    <partnerLink name="classified"                  partnerLinkType="lns:bookLinkType"                 partnerRole="classified"/>  </partnerLinks>  <faultHandlers>    <catch faultName="classifiedFault"            faultVariable="error">      <reply partnerLink="customer"             portType="apns:bankPT"              operation="depositToBank"             variable="error"              faultName="invalidRequest"/>    </catch>  </faultHandlers><sequence>  <receive name="receive1" partnerLink="customer"            portType="asns:bankPT"            operation="depositToBank" variable="request"           createInstance="yes">  </receive>  <assign name="assignclassified">    <copy>      <from variable="request" part="classifiedName"/>      <to variable="classifiedMessage" part="classifiedName"/>    </copy>       <copy>      <from variable="request" part="amount"/>      <to variable="classifiedMessage" part="amount"/>    </copy>  </assign>  <assign name="assignbank">    <copy>      <from variable="request" part="userName"/>      <to variable="bankMessage" part="userName"/>    </copy>    <copy>      <from variable="request" part="amount"/>      <to variable="bankMessage" part="amount"/>    </copy>  </assign>  <invoke name="invokeBank" partnerLink="bank"           portType="asns:bankPT"           operation="depositToBank"          inputVariable="bankMessage"            outputVariable="bankapprovalInfo">  </invoke>  <switch>    <case condition="bpws:getVariableData('bankapprovalInfo','accept')=1">      <invoke name="invokeClassified"              partnerLink="classified"               portType="apns:classifiedPT"               operation="bookClassified"              inputVariable="classifiedMessage"                outputVariable="approvalInfo">      </invoke>    </case>  <otherwise>    <assign name="assignMessage">      <copy>        <from expression="'Bank payment failed'"/>        <to variable="approvalInfo" part="accept"/>      </copy>    </assign>  </otherwise></switch><reply name="reply"       partnerLink="customer"       portType="asns:bankPT"        operation="depositToBank"       variable="approvalInfo"></reply></sequence></process>
      

綜述

在典型的 WS-BPEL 業務流程的執行過程中,将涉及到許多不同的應用程式。例如,可以将運作中的 Daily Moon WS-BPEL 作為一個例子,其中有下面的部分正在運作:

  • 分類廣告 Web 服務
  • 銀行的 Web 服務
  • 将運作 WS-BPEL 流程的 WS-BPEL 運作時環境

進行設定

  1. 在相同的 J2EE 伺服器上運作這兩個 Web 服務和您的 BPEL 運作時環境。
  2. 下載下傳 Geronimo 并安裝它。這個示例使用了 Apache 的 Geronimo 伺服器,該伺服器可以免費使用,并且很容易進行設定。
  3. 下載下傳用于 Web 服務 Java 運作時(或 BPWS4J)的 IBM 業務流程執行語言。BPWS4J 是一個功能齊全的平台,可用于運作以 BPEL 描述的業務流程。下載下傳 bpws4j 引擎 的版本 2.1。
  4. 從 BPWS4J 分發版中複制 bpws4j.war,并将其放入您的 Geronimo 伺服器的部署目錄。Geronimo 将發現這個新的 Web 應用程式,并自動部署它。現在,使用 URL http://localhost:8080/bpws4j/admin,您應該能夠看見 BPWS4J 管理控制台,如圖 1 所示。

圖 1. BPWS4J 管理控制台

正如其中的大按鈕所示,這個管理應用程式可以用于部署、列出、删除 BPWS4J 運作時環境中的 WS-BPEL 業務流程。

在部署您的業務流程之前,先部署您的兩個 Web 服務:分類 Web 服務和銀行 Web 服務。本教程提供了一個代碼包,其中包括捆綁了這兩個 Web 服務的稱為 myservices.war 的單獨檔案。建立這個包的副本,并将其放入 Geronimo 的部署目錄。Geronimo 将發現這個新的包,并部署這兩個 Web 服務。

回頁首

部署業務流程

對于不同的WS-BPEL 環境,部署業務流程的操作細節也有所不同,但它們都應該是相當簡單的。要在 BPWS4J 上部署業務流程,隻需要點選幾下滑鼠即可。

  1. 在 BPWS4J 管理 Web 應用程式中單擊 Deploy 按鈕。将會提示您提供所建立的 WSDL 和 BPEL 文檔,它們分别為您的業務流程和業務流程本身定義了端點。圖 2 顯示了這項任務。 

    圖 2. 提供流程 WSDL 和 BPEL 檔案

  2. 浏覽到 bookclassified.wsdl 和 bookclassified.bpel 檔案,并選擇 Continue Deployment。将會提示您為業務流程中所涉及到的每個合作夥伴服務提供 WSDL,當然,這裡的合作夥伴服務就是您的分類和銀行服務。如圖 3 所示。 

    圖 3. 為所有的合作夥伴 Web 服務提供 WSDL

  3. 找到這些 WSDL,并選擇 Start Service the Process。BPWS4J 将嘗試開始執行您的業務流程。圖 4 顯示了 Daily Moon 業務流程的成功啟動。

圖 4. 業務流程的啟動

回頁首

調用業務流程

下一步操作是通過調用業務流程來測試您的服務。當然,這意味着對該服務進行簡單的 SOAP 調用,在為服務建立的 WSDL 中對該服務進行了描述。本文包含完成這項調用的一個 Java 程式,以及一個用于測試的簡單批處理腳本。為了使這項測試變得簡單,可以限定您的銀行服務僅接受任何金額超過 30 的付款,而拒絕其他的付款。使用參數值 40 運作一次業務流程,并期待運作成功。使用參數值 20 運作一次業務流程,并期待運作失敗。運作結果如清單 14 所示。

清單 14. 調用您的業務流程

C:\bpel\client>testcustomer.cmd http://localhost:8080/bpws4j/axisengine classifiedName userName 40successC:\bpel\client>testcustomer.cmd http://localhost:8080/bpws4j/axisengine classifiedName userName 20Bank payment failed
      

總結

本教程向您介紹了業務流程管理中的 WS-BPEL 和一些實際的概念。Web 服務無處不在,在這種環境中,有必要使用标準的技術通過編寫腳本來實作它們之間的互動,以便将它們組合為支援重要業務流程的、功能更強大的 Web 服務。

WS-BPEL 正是一個示例,它說明了通過本系列教程中介紹的标準技術,能夠完成哪些任務。這些标準為應用程式開發人員提供了一系列功能強大的工具,以便內建企業業務應用程式,以及建構新型的跨多個企業的應用程式。

繼續閱讀