• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 181, 文章 - 2, 評論 - 85, 引用 - 0
            數據加載中……

            IBM WebSphere 開發者技術期刊: 使用 Rational Application Developer 和 WebSphere Application Server 來加速基于 XML 的 SOA 的 JSF 開發——第 4 部分

                 摘要: 本文是此系列文章的第 4 部分,該系列提出了加快基于 XML 的面向服務體系結構(Service Oriented Architecture,SOA)應用程序表示開發的解決方案。本文重點集中于利用 IBM ? Rational? Application Developer V6 和 IBM Websphere ? Portal 開發 portlet。Portlet 用個人化的、管理的、再次使用的內...  閱讀全文

            posted @ 2006-04-17 03:30 wsdfsdf 閱讀(478) | 評論 (0)編輯 收藏

            IBM WebSphere 開發者技術期刊: 使用 Rational Application Developer 和 WebSphere Application Server 來加速基于 XML 的 SOA 的 JSF 開發——第 3 部分

                 摘要: 本文是提出了加快基于 XML 的面向服務的體系結構(Service Oriented Architecture,SOA)應用程序表示開發的解決方案系列文章的第 3 部分。這種解決方案包括 Eclipse 功能,可以生成靜態類型的用于 XSD Schema 的服務對象數據(Service Data Object,SDO),并提供了在表示元素數據與 XML 數據相互轉換中使用 SDO 的運行框架。第三...  閱讀全文

            posted @ 2006-04-17 03:22 wsdfsdf 閱讀(482) | 評論 (0)編輯 收藏

            在企業級 SOA 中使用 Web 服務,第 3 部分: 將您的 SOA 合并成三維的整合中心以提高速度和可靠性

            將您的 SOA 合并成三維空間的整合中心,以提高 Web 服務的互用性。Judith M. Myerson 給出了四個合并的實例:非共享的 SOA 的二維中心、共享的 SOA 的二維中心、共享的 SOA 的三維中心的兩種視圖。權衡各種利弊,確定三維空間中的整合中心可以承載的 SOA 的最大數目是非常重要的,使得能夠避免中心超負荷。

            引言

            在企業級 SOA 系列文章的第二篇——“使外部 Web 服務互操作性最優”中,我給出了不會導致多個 SOA 超負荷的服務互用性的實例——從簡單的協議共存到復雜的多平臺的互用性。我談論了有關您如何使用 Visual Studio .Net 來開發 Microsoft? .Net 平臺上的 Web 服務以及如何在 IBM? WebSphere? Application Server 上運行它們的相關問題。

            在本文中,我將談論如何將 Web 服務及非 Web 服務的多重 SOA 合并成三維的整合中心來連接各種后端企業主機系統,包括:

            • 企業資源規劃(Enterprise Resource Planning,ERP)
            • 客戶關系管理(Customer Relationship Management,CRM)
            • 供應鏈管理(Supply Chain Management,SCM)
            • 其它企業應用程序集成(Enterprise Application Integration,EAI)的應用程序
            • 虛擬的數據庫管理系統

            我也將討論中心如何接受輸入數據——事件和數據——來源于各種資源。我使用 X、Y 和 Z 軸在三維空間中展示圖片。







            什么是 SOA 整合中心?

            SOA 整合中心是 Web 服務與非 Web 服務的合并的 SOA 與后端企業系統的集成。它使得 Web 服務及非 Web 服務能夠與運行在不同平臺上的服務器、主機和微機上的企業系統交互。

            然而,SOA 整合中心不同于面向服務的整合(service-oriented integration,SOI)。SOI 將 Web 服務與運行在不同平臺上的主機系統相整合。它使得 Web 服務能夠通過網關與主機交互。您需要 ASP.Net 或其它技術獲取網關來執行普通的 Web 服務。

            SOA 是基于一套業務流程的 Web 服務的交互的體系結構。您可以在第一個 SOA 中獲取 Web 服務來在第二個 SOA 中復用代表 Web 服務的服務。Web 服務可能由一些小的 Web 服務組成,它們將服務傳遞給客戶。

            您使用描述語言(例如,SOAP)或其它描述交互的方法(例如,REST)來定義交互。每個交互都是獨立且松耦合的,以便每個交互都能獨立于任何其它交互。這與依賴網關來與 Web 服務集成的緊耦合的主機系統形成對照。







            SOA 層

            我們看一下二維空間中的 SOA 層。之后,我將向您展示為何三維的整合中心是更好的選擇。

            SOA 的 IBM 版本的前五層(請見參考資料)是(從下至上):

            • 操作系統
            • 基于組件的(系統)
            • 服務
            • 業務流程
            • 表示層

            第六層是集成體系結構(也作為企業集成總線(Enterprise Integration Bus)),它垂直覆蓋了前五層。下一層是服務質量、安全、管理及監控層。

            顯而易見,操作層由 EAI 打包的應用程序、遺留、老式的面向對象及商業智能應用程序組成。它們都可以通過使用 SOI(在項目級或企業級)來同第二層的基于組件的系統相集成。然后,將組件結合或集成到復合應用程序中來提供第三層的服務。

            第四層向您展示了那些服務是如何根據一套業務流程從一個流向另一個的。更高一層通過遠程門戶網站 Web 服務(Web Services for Remote Portlet,WSRP)標準或其它面向人的表示層的方法來將 Web 服務應用于應用程序接口中。

            二維靜態的 SOA 可能是有問題的。幸好,整合中心的發展意味著 SOA 將變成三維動態的。







            可復用的體系結構

            我們假設該 Web 服務需要在 .Net 平臺上或隨后的 WebSphere 平臺上運行前從主機系統獲取信息。您需要將 Web 服務與執行普通 Web 服務的主機網關相整合。

            所有 Web 服務彼此以 XML 傳遞信息——多個 SOA 中的業務流程應當如何整合及其在提供的服務中如何實現。雖然在多個 SOA 中 Web 服務是可復用的,但是我進一步將 SOA 處理成可復用的體系結構。

            我有多個實例,它們關于將可復用的 SOA 合并成與主機系統相連的整合中心,我提出如下四步來創建中心:

            1. 將作為可復用的體系結構的 SOA 數組劃分成兩個模塊。第一模塊主要包括整合 Web 服務的機制,而第二個模塊重在服務交互。
            2. 為了獲得最佳的速度及可靠性,將每個 SOA 優化成更緊湊的形式。檢查可能影響性能的磁盤碎片空間。
            3. 將 SOA 按照重要性及復用頻率區分優先次序。檢查用戶對于更改 SOA 優先權的需求。
            4. 將 SOA 合并成連接到一個或更多主機系統的整合中心,這些主機系統運行在不同的平臺上。檢查先前沒有被提出的互用性問題。






            模塊化的 SOA 庫

            您可以開發模塊化的和優化的 SOA 庫,這些 SOA 被分成了不同類別的層次。每個類別可以通過層次最低級別的 Web 服務被進一步劃分成 SOA 的子組。

            您可以將庫用作到 Web 服務應用程序的動態鏈接。當應用程序需要訪問模塊化的 SOA 時,它將自己鏈接到庫中。當它不再需要檢索到的 SOA 時,將從庫中釋放自己,當提高速度及性能時節省磁盤空間。

            下列是庫中模塊化的 SOA 的一些實例:

            • 衛生保健 SOA
            • 零售管理 SOA
            • 物流 SOA
            • 無線射頻識別(Radio Frequency Identification,RFID)SOA






            庫用例

            假設您使用在庫中使用最后三個 SOA(零售管理、物流和 RFID)來開發整合中心并將它們連接到主機網關中。今后,用戶的需求改變了——取消零售管理 SOA 并以衛生保健 SOA 代替它。

            同時,用新版本更新物流 SOA 使其迎合用戶的需求。在 RFID SOA 中包含新的子組之后,將所有子組區分優先次序并將它們優化。







            二維非共享的 SOA

            我們看一下 Blue Repository 中的三個模塊化的 SOA(零售管理、物流和 RFID)的二維中心(請見圖 1)。所有都連接到主機網關中。例如,如果您使用 ASP.Net,那么您可以通過網關來執行普通的 Web 服務。


            圖 1. 非共享的 SOA 的二維中心
            非共享的 SOA 的二維中心

            如您所見,SOA 不是共享的。您可以將這三者結合成復合應用程序以減少到主機網關的連接器的數目。







            二維共享的 SOA

            圖 2 所示,RFID SOA 與物流 SOA 在一邊相交疊。交疊區域用黃色帶黑色斜線來顯示。它包含 SOA 用于生成一個或兩個服務的資源。


            圖 2. 共享的 SOA 的二維中心
            共享的 SOA 的二維中心






            代表三維空間中的中心

            您怎樣在二維計算機屏幕上設想三維的中心?處理該問題的一種方法是在二維平面中畫出整合中心的 X、Y 和 Z 軸。另一種方法是使用軟件簡單地將 2D 圖片轉換成 3D 的版本。

            在三維的中心,您可以在不改變 SOA 的情況下將現有的主機替換成新樣式或另一供應商的樣式。另外,您可以重新配置或更改 SOA 的優先權以適合新的或已更新的主機系統對于更改用戶及組織的需求的響應。







            第一個三維中心

            考慮如圖 3 所示的三維空間中的整合中心。如您所見,RFID SOA 中部分位于物流 SOA 之后。RFID SOA 的隱藏部分用到物流 SOA 的藍色線畫出。


            圖 3. 第一個共享的 SOA 的三維中心
            第一個共享的 SOA 的三維中心

            如您所見,連接器從 RFID SOA 通過(而不是環繞)物流 SOA 到主機網關。這意味著從 RFID SOA 而來的連接器與物流 SOA 共享了一些資源。







            第二個三維中心

            設想 RFID SOA 的重疊部分在物流 SOA 的前面,但是不是從任一側,如圖 4 所示。這給了 RFID SOA 更多的選擇來共享物流 SOA 中的大量資源。


            圖 4. 第二個共享的 SOA 的三維中心
            第二個共享的 SOA 的三維中心

            如您所見,連接器從 RFID SOA 通過物流 SOA。






            有多少共享的 SOA?

            在三維中心中您可以共享的 SOA 的數目依賴于項目復雜性、合并問題及業務流程中的利弊。向您避免 SOA 的過量開銷一樣,您需要確保在開發的整個生命周期中不會在三維空間中發生中心超負荷的問題。您應當在周期的每個時刻都測試超負荷。







            結束語

            在三維中心中合并 SOA 需要預先規劃來設置開發和共享的 SOA 的數目限制。您應當同業務分析師開發組交流有關各種合并問題的信息。您將發現解決合并問題會使您開發三維中心的工作變得非常容易。您可以開發在中心可復用和共享的 SOA。分析師將發現解決該問題會使他們的設計和分析三維空間的中心的工作變得非常容易。他們可以確定在不會導致中心超負荷的前提下哪個主機系統可以連接到中心。

            posted @ 2006-04-17 03:19 wsdfsdf 閱讀(172) | 評論 (1)編輯 收藏

            使用 Rational Application Developer 和 WebSphere Application Server 來加速基于 XML 的 SOA 的 JSF 開發——第 2 部分

                 摘要: 本文提出了加快基于 XML 的面向服務的體系結構(Service Oriented Architecture,SOA)應用程序表示開發的解決方案系列文章的第 2 部分。這種解決方案包括 Eclipse 功能,可以生成靜態類型的用于 XSD Schema 的服務對象數據(Service Data Object,SDO),并提供了在表示元素數據與 XML 數據相互轉換中使用 SDO 的運行框架。第 2...  閱讀全文

            posted @ 2006-04-17 03:17 wsdfsdf 閱讀(283) | 評論 (0)編輯 收藏

            在企業級 SOA 中使用 Web 服務,第 2 部分: 使外部 Web 服務互操作性最優

            外部和內部 Web 服務之間多個面向服務的體系結構 (Service-Oriented Architectures,SOA) 中的外部 Web 服務的互操作性最優。Judith Myerson 展示了如何更改服務的類型、位置以及每個 Web 服務的平臺,以便實現原始應用程序的業務流程。

            引言

            在關于企業級面向服務的體系結構 (SOA) 系列我的第一篇文章,“使用多重 SOA 來消除企業系統之間的差異”(參閱參考資料)中,通過說明如何重用一個或多個 SOA 中的 Web 服務(以數據為中心 (data-centric) 和業務邏輯),然后將他們聯合到一個受組織控制的組合應用程序中,討論了使用 SOA 縮小企業系統差異的方案。

            當 Web 服務不受組織所控制時,需要確保它們在外部可以彼此互操作,來共享語義和契約職責。語義的誤解(例如所有權)和契約漏洞(例如多平臺間的區別)會影響外部企業 Web 服務之間的互操作性問題。

            在本文中,我展示了四個實現制造資源規劃 (Manufacturing Resource Planning,MRP) 和客戶關系管理 (Customer Relationship Management,CRM) 服務的實例,如下所示:

            1. 企業以前的應用程序
            2. 到外部 Web 服務的動態鏈接
            3. 請求外部 Web 服務的 REpresentational State Transfer/Simple Object Access Protocol (REST/SOAP) 共存
            4. 使用 IBM? WebSphere? Application Server 和 Microsoft? Visual Studio .Net 的 Web 服務互操作性

            考慮各種交易時,確定系統可以負載的可互操作的 SOA 的數量非常重要,這樣可以避免 SOA 過載。







            企業以前的應用程序

            假設企業以前的應用程序(參見圖 1)被分成業務流程的模塊化組件。該應用程序的兩個重要組件(MRP 和 CRM)要求不斷發生變化且重新編譯長期運行的應用程序。


            圖 1. 企業以前的應用程序
            企業以前的應用程序






            動態服務鏈接

            為增加運行效率,從應用程序中提取出這些組件并將其重新構建為外部 Web 服務更有意義。通過這種方式,您可以更改兩個 Web 服務的代碼,而不用重新編譯龐大的、復雜的長期運行的應用程序。

            在第一個 SOA(參見圖 2)中以更加緊湊的形式重新設計的應用程序可以動態鏈接到第二個 SOA 中的外部企業 MRP Web 服務,依次的,指向第三個 SOA 中的外部企業 CRM Web 服務。一旦收到請求,CRM Web 服務將請求和信息發送給應用程序來進行進一步處理。


            圖 2. 到 Web 服務的動態鏈接
            動態鏈接

            每個鏈接機制都是以發送請求或消息,接收響應,或執行 SQL 或 HTTP 操作的形式出現的。還可以封裝沒有 MRP 組件的應用程序,這樣就可以向 MRP Web 服務發送請求。







            軟件架構

            需要牢記,在從一個協議轉換到另一個,或者從一個軟件架構轉換到另一個時,可能會引起平臺間的互操作性問題。一些實例包括 SOAP、REST、.Net 架構、企業 Java Bean (Enterprise Java Beans,EJB) 以及 Java 消息服務 (Java Messaging Service,JMS)。

            運行在 HTTP 上的 .Net Web 服務可以以三種不同的方式調用:HTTP GET 操作、HTTP POST 操作和 SOAP。如果需要快速的調用 Web 服務且沒有 SOAP 客戶端的話,GET 和 POST 操作都是非常有用的。可以通過 Perl 腳本在 HTTP 上使用 REST 來執行 GET、POST、PUT 和 DELETE 操作。在這個腳本中,您可以指定 SQL 查詢和簡單的消息隊列。

            如果 SOAP 客戶端可用,下面是如何在 REST 和 SOAP 之間進行簡單的選擇。如果應用程序是 基于資源的,選擇 REST。如果應用程序是 基于行為的,選擇 SOAP。在 REST 中,客戶端可以通過 HTTP 請求執行在一系列資源上的多個操作。對于基于 SOAP 的請求,可能需要執行請求的每個面向活動的客戶端可能僅需要一個調用操作。







            調用框架

            要構建 SOAP 請求,需要使用 Web 服務描述語言 (Web Services Description Language,WSDL),這是一種描述如何訪問 Web 服務以及將執行什么操作的語言。您可以指定服務的類型,而不用自定義 Web 服務的代碼,也不用重新編譯以前的應用程序。

            為確保 WSDL 文件能在各種軟件架構中工作,您可以利用 IBM Web Services Invocation Framework (WSIF),它讓您可以將 WSDL 作為不同軟件標準來描述。這表明您可以通過描述語言周圍的 API 以獨立于協議和位置的方式訪問 WSDL。還意味著您可以通過 WSDL 將 Web 服務結合復合成應用程序,在 WSDL 中您可以在各種條件和異常情況下切換協議和位置。

            為構建 WSIF,無論您打算使用什么提供商,您都需要滿足最低需求,該選項包括如下:

            • JAXP XML 解析器
            • Java API 的 WSDL
            • Apache SOAP
            • Apache Axis。






            REST 和 SOAP 共存

            雖然 REST 請求不像 SOAP 請求那樣依賴 WSDL,您仍需要 XML Schema 來驗證 REST 操作。既然 WSDL 支持 schema 規范,REST 和 SOAP 可以作為從一個合成的 Web 服務應用程序到外部應用程序的請求而共存。

            例如,SOA #1(參閱圖 3)中的應用程序首先發送 SOAP 請求調用 SOA #2 的 MRP Web 服務中調用基于活動的服務,接下來發送一個 REST 請求來操作相同 MRP Web 服務中的面向行為的服務。所有基于 SOAP 的請求都是基于 IBM WSIF 的。


            圖 3. REST 和 SOAP 共存
            REST 和 SOAP 共存

            正如您所見到的,第一個 SOA 里面的應用程序運行在 Unix 或者 Linux 服務器上,而第二個 SOA 中的 MRP Web 服務運行在 IBM WebSphere Application Server (Application Server) 中。您可以使用 WSIF 來更改基于 SOAP 的請求的規范版本中的服務類型和位置。







            WebSphere 和 .Net 產品的互操作性

            如果您希望開發更加復雜的 Web 服務,作為 Linux 或者 Window 平臺上的較大企業系統開發項目的一部分,可以考慮使用用于 WebSphere 軟件的 IBM Rational? Application Developer。它同用于 Java? 和 EJB 的統一建模語言 (Universal Modeling Language,UML) Visual Editor 一起提供,并且運行在 Eclipse 源碼開放平臺上,允許您擴展您的開發環境。還可以使用 Microsoft Visual Studio.Net。

            您可以使用軟件來將應用程序邏輯分割成模塊化的多業務流程 Web 服務組件。IBM 通過提供 Web Services Navigator(Rational Application Developer 插件) 更前進了一步,讓您直觀地同 Web 服務事務交互。

            如果您正在使用 Visual Studio.Net 在 Microsoft .Net 平臺上開發 Web 服務,可以在 Application Server 中運行它們。這意味著使兩個平臺之間的 Web 服務互操作(參閱參考資料),您所要做的只是開發與兩種平臺公用的 WSDL。

            例如,運行在 Unix 或者 Linux 服務器上的應用程序(參見圖 4)首先發送 SOAP 請求來調用運行在 Application Server 上的 MRP Web 服務的基于活動的服務。接下來,該應用程序發送一個 REST 請求來執行同樣 MRP Web 服務上的一系列基于資源的服務。一旦收到請求,SOA #3 中的 CRM Web 服務向原始應用程序發送一個請求或者信息。


            圖 4. 多平臺外部 Web 服務
            多平臺外部 Web 服務

            正如您所看到的,第三個 SOA 中的 CRM Web 服務運行在 .Net 平臺上并且訪問 Application Server。CRM Web 服務向第一個 SOA 中的應用程序發送請求或者信息。您可以為 Visual Studio.NET 添加一個 Visual Perl 插件。您還可以使用用于 Unix 到 Windows 移植的命令行級別的基于 REST 的腳本,并且使其適應 Visual Perl 環境,這取決于簡本的復雜性。







            Visual Studio

            對于您來說,使用 Visual Studio .Net 比 Visual Basic、C++、Java、Kornshell 來封裝 Unix 應用程序為 COM 組件要更加容易。同樣,如果您正在開發應用程序,使用 Unix shell 腳本來運行 Window 應用程序,或者如果您將 Unix 應用程序移植到 Window 平臺下來鏈接到外部 Web 服務,使用它也非常容易。

            這里有一些您應該了解的提示。首先,您應該將自己的 WSDL 文件發布到一個公共的位置來解決互操作性的差別。您可以跳過 Rational Application Developer's 自底向上的方法或者 Visual Studio .Net 的 WSDL First 方法中的自動生成 WSDL 文件。可以使用 Rational Application Developer 的 Skeleton 或者自頂向下的方法 來啟動您的 WSDL 文件并填充 Java Class 實現。或者,還可以禁用 Visual Studio 的 WDSL First 方法中的自動生成 WSDL 文件選項并且發布您自己的 WSDL。

            第二,要為自己提供一個可以使用的 WSDL 模板,可以考慮 Rational Application Developer 的自底向上的方法(從 Java Bean 開始),Rational XDE(基于類模型生成模板代碼),或者 Visual Studio 的 Implementation First Approach(在通過編寫 Web 服務代碼開始后生成模板代碼)。然而 Rational Application Developer 提供了 WSDL,Visual Studio.Net 可能沒有提供。







            需要多少 SOA?

            用來連接 EAI 應用程序的 SOA 的數量取決于項目、互操作性問題、業務流程和負載性能問題之間復雜性的平衡。如果您避免了 SOAP 超標,您需要確保 SOAP 在開發的整個生命周期不會超載。您應該在周期的每一點上測試超載。







            結束語

            使多平臺 SOA 之間的外部 Web 服務互操作性最優需要事先計劃好可以開發多少 SOA。您應該與業務分析團隊和 IT 專家在各種性能問題上進行交流。您會發現解決互操作性問題將使您的開發工作變得更加得容易。您可以開發外部 Web 服務,每個服務可以使用不同的平臺和請求協議。分析師將發現解決該問題將使設計和分析多個 SOA 系統的工作更加容易。他們可以確定 Web 服務可以運行在什么平臺上,而不用導致 SOA 超載。

            posted @ 2006-04-17 03:13 wsdfsdf 閱讀(141) | 評論 (1)編輯 收藏

            在企業級 SOA 中使用 Web 服務,第 1 部分: 使用多重 SOA 來消除企業系統之間的差異

            使用多重面向服務的體系結構(Service-Oriented Architectures,SOA)可以消除企業系統之間的差異。Judith M. Myerson 向您展示了四種場景,它們將 Web 服務結合到復合應用程序中,該應用程序由獨立 SOA、多重 SOA、具備多重 EAI 應用程序的獨立 SOA 以及具備 EAI 應用程序的多重 SOA 復合而成。然而仍舊要考慮各種權衡,確定系統可以攜帶的 SOA 的最大數目可以使您避免 SOA 的超載。

            引言

            在服務級協議(Service-Level Agreements,SLA)系列的第三篇文章(“在 Web 服務上下文中使用 SLA”,請見參考資料)中,我談論了 Web 服務是如何作為 EAI 限制來補充 Enterprise Application Integration(EAI)應用程序的。我進一步討論了使用 SOA 來消除企業系統之間的差異的場景,向您展示了如何執行獲取 EAI 應用程序所有權的 Web 服務的業務邏輯。我向您展示了如何復用以數據為中心的 Web 服務以及來源于一個或更多 SOA 的業務邏輯并將它們結合進復合應用程序中。







            EAI 差異

            我重在研究 EAI 解決方案的三個主要的局限:所有權、有限的集成以及缺少開放行業標準。在公司的 EAI 應用程序之間存在信息傳遞的差異,例如:

            • 客戶關系管理(Customer relationship management,CRM)
            • 投資關系管理(Investor relationship management,IRM)
            • 供應鏈管理(Supply-chain management,SCM)
            • 企業資源規劃(Enterprise resource planning,ERP)

            EAI 應用程序的所有權性質受到公司應用于 EAI 應用程序中的業務流程類型和公司經營的業務類型的限制。EAI 解決方案限制了使用外部應用程序來集成 EAI 系統的范圍。對于在 EAI 系統及外部應用程序之間映射業務邏輯的計劃的定制是浪費時間并且代價昂貴的。

            實現 EAI 的標準事實上是不存在的。沒有標準,在互聯網上整合多商家的 EAI 應用程序是非常困難的。與 EAI 不同,Web 服務提供了廣泛的標準,為應用程序與外部的服務提供者之間搭建了橋梁。然而,EAI 比 Web 服務更加安全,IT 行業聯合起來創建并改善了現有的標準(WS-Security)為 Web 服務提供了更加安全的機制。







            消除差異

            各種窗體的中間件技術已經被用于消除 EAI 差異。Web 服務是使得 EAI 應用程序能夠互相傳遞信息的最好的中間件。它們提供了開放的行業標準,為獨立平臺的 EAI 系統搭建了橋梁。一些附加的 EAI 應用程序承擔了開放行業業務流程的提供者或客戶的職責,EAI 應用程序不能在封閉環境下采用該流程。

            事實上,在獨立 SOA 中不是所有 Web 服務都可用。您可以將 Web 服務與基本功能相結合形成復合的 Web 服務應用程序。相反,您可以將這些應用程序同其它的 Web 服務或其它 SOA 中的復合業務相結合來建立新的或更高級的業務服務。這意味著您可以使用多重 SOA 來消除 EAI 應用程序之間的或系統之間的差異。







            編制 Web 服務

            在 SOA 中,使用一系列高級業務服務的業務流程來編制多重 Web 服務的執行。以數據為中心的 Web 服務很少自我執行。編制的目標是使得 Web 服務能夠消除 EAI 的差異,以便具有所有權的 EAI 應用程序可以通過整合的集線器來互相交流。

            在編制過程中,您可以擴大或縮小編制的范圍和性質,通過復用代碼來改變復合應用程序的業務流程邏輯。基于個人提出的功能,SOA 中的 Web 服務可被復用并結合到高級服務的復合應用程序中來創建新的業務服務,反之,該業務服務可被復用并結合到另一個 SOA 的業務服務的高級復合應用程序中。







            避免錯誤

            我想到了當開發 Web 服務或將 Web 服務結合進復合應用程序時可能發生的四個錯誤,您應當避免:

            1. 簡單對象訪問協議(Simple Object Access Protocol,SOAP)的開銷
            2. SOAP 互用性問題
            3. 緊密結合的業務服務
            4. 處理繁重事務的環境。

            在每個地方都建立 Web 服務并且將它們結合到所有 Web 服務的應用程序中是不太實際的,即使 Web 服務是基于日益擴大的開放行業標準的(EAI 應用程序缺少這些標準)。當處理 Web 服務時企業可能會產生大量的 SOAP 開銷,這樣就減慢了完成業務流程的速度。

            企業也可能遇到 Web 服務中的 SOAP 互用性的問題。雖然已經完成了大量的工作,使 SOAP 的互用性得到了提高,但是還沒有實現行業級的完全互用。

            一些具備所有權的 EAI 應用程序可以在緊耦合的環境下很好地執行某些業務功能,在復合應用程序中的 Web 服務不能在松耦合的環境下很好地執行。一個緊耦合的業務服務的實例是客戶將卡插入讀卡機中,確認卡的金額,指定取出的現金并收到自動地從他的帳戶中取款的確認。

            在短時間內一些 Web 服務連同其它的 Web 服務(包括長期運行的基于一套復合業務規則的應用程序)一起完成了業務流程,在整合這樣的 Web 服務的過程中您可能會發現問題。Web 服務非常適合于短時間運行的應用程序,而不適合于處理繁重事務的環境,因為在這樣的環境下需要很長時間才能完成業務流程。







            獨立的 SOA 場景

            現在我們來看一下您怎樣才能使 Web 服務同基本功能相結合來構建復合的 Web 服務應用程序,假設裝載的性能是令人滿意的。考慮下面的 Web 服務,每個都來自于完全互用的系統:

            • 零售商的標識符
            • 零售商的名稱
            • 零售商的地址
            • 定購的數量
            • 價格
            • 稅務

            圖 1 所示,前四種 Web 服務僅包含基本功能的數據,而最后兩個主要使用業務邏輯來達到向零售商發送帳單的目的。我將所有的都結合到復合的具備帳單功能的應用程序中,也就是在結帳應用程序中進行處理。


            圖 1. 獨立 SOA 的場景
            獨立 SOA 的場景

            我使用零售商標識符的 Web 服務來啟動流程,該服務向零售商名稱的 Web 服務發出請求來獲得與零售商標識符相匹配的名稱。當確認信息的時候,零售商名稱的 Web 服務與零售商地址的 Web 服務、定購數量的 Web 服務、價格的 Web 服務和稅務的 Web 服務相結合來建立具備零售商帳單功能的復合應用程序。隨后,在基于服務的業務邏輯的結帳應用程序中處理了該復合應用程序。







            多重 SOA 的場景

            我們假設小公司缺乏內部的 Tax Service 部門。對于更新、維護的業務有外來的稅務服務并且管理外來稅務的 Web 服務。對于該公司,我將第一個場景中的前五種 Web 服務結合進具有帳單功能的復合應用程序中,同時假設裝載流程的性能是令人滿意的。

            我們假設 Web 服務發出了請求——將第二個 SOA 中外來的 Web 服務與第一個 SOA 中的復合應用程序相結合。如果接受并實現了該請求,那么在基于價格和稅務服務的業務邏輯的結帳應用程序中將處理高級的復合應用程序。如圖 2 所示,第二個 SOA 與第一個 SOA 交疊,該交疊的部分可能包含 SOA 中普遍的 Web 服務和非 Web 服務。


            圖 2. 多重 SOA 的場景
            多重 SOA 的場景






            獨立 SOA 調用 EAI 應用程序

            重在關聯、鏈式管理,資源規劃的 Web 服務有不同的整合規則(或虛擬的整合集線器),即使它們在整合企業之間的應用程序的過程中可以互相合作。相反,EAI 系統的組件可以通過中間件技術的整合集線器來互相傳遞信息使得 EAI 應用程序能夠同遺留系統、數據庫、Web 服務及非 Web 服務進行交互。

            我們將 SOA 作為實現多重 EAI 應用程序(在防火墻內部及防火墻外部)的業務功能的主要的中間件技術。為了避免 SOAP 開銷,限制 Web 服務的數量。同時,避免降低裝載由 Web 服務調用的 EAI 應用程序的速度。

            在獨立 SOA 調用多重 EAI 應用程序的場景中,零售商標識符的 Web 服務首先調用了 Retail Management System(請見圖 3)。在成功地裝載了所應調用的應用程序之后,Web 服務發出了將標識符與名稱及地址相鏈接的請求。


            圖 3. 調用多重 EAI 應用程序的獨立 SOA
            調用多重 EAI 應用程序的獨立 SOA

            然后 EAI 應用程序在數據庫中搜索請求的項目。如果找到了名稱及地址,那么它就向 SOA 發出信息來將定購數量及價格的 Web 服務添加到復合應用程序中。同時卸載 Retail Management System 來為今后調用其它 EAI 應用程序提供空間。

            接下來,復合應用程序調用了 Finance Management System,該系統維護 Tax Service 流程規則的數據庫。在成功地裝載了該 EAI 應用程序之后,定購的數量及價格的應用程序與其相連。高級復合帳單功能就形成了。同時卸載 Finance Management System。







            多重 SOA 調用 EAI 應用程序

            現在,我們假設需要兩個 SOA 連接兩個 EAI 應用程序。在該場景中,我將 Order Quantity 和 Order Description Web Services 結合到第一個 SOA 中。我重復了第三個場景中的流程,調用并裝載了零售商標識符的 Web 服務,并且向 Retail Management System(請見圖 4)發出搜索請求。在成功搜索完之后,該 EAI 應用程序向 SOA 發出信息來將其添加到復合應用程序中。


            圖 4. 多重 SOA 調用多重 EAI 應用程序
            多重 SOA 調用多重 EAI 應用程序

            接下來,復合應用程序調用并向 Order Management System 發出請求來搜索 Pricing Policies 數據庫。在成功搜索之后,Order Management System 將其本身與第二個 SOA 中的稅務 Web 服務相連接。然后,稅務 Web 服務被并入了第一個 SOA 的復合帳單功能中。所有裝載及卸載的流程都成功地完成了,沒有出現 SOAP 開銷問題。







            有多少 SOA?

            您用于鏈接 EAI 應用程序的可用的 SOA 的數量依賴于對項目的復雜性、互用性問題、業務流程及裝載性能問題的權衡。同您避免 SOAP 的開銷一樣,您需確保在整個開發周期中不會出現 SOA 超載問題。您應當在開發的每個階段都進行超載測試。







            結束語

            使用 SOA 來消除企業系統之間的差異需要提前規劃,設置需開發的 SOA 的數量限制。您應當同業務分析師及 IT 專家小組對于各種性能問題進行交流。您會發現使用 SOA 來消除 EAI 差異這種方法使您開發應用程序的工作變得更加容易。您可以將來源于一個或更多 SOA 的 Web 服務的業務邏輯結合成一個或更多的復合應用程序。分析師將會發現消除差異使得他們設計及分析 SOA 系統的工作變得更加容易。他們可以確定結合哪些 Web 服務能夠達到最佳的性能,并且不會發生 SOAP 超載的問題。

            posted @ 2006-04-17 03:09 wsdfsdf 閱讀(161) | 評論 (1)編輯 收藏

            在可用的分布式 SOA 中管理及發布服務引用和元數據

            在分布式應用程序中正確的管理、發布引用及配置數據總是具有挑戰性。面向服務的體系結構 (SOA)、實時及事件驅動處理 (7x24) 的使用使得這項任務成為主要的問題。在接下來的部分當中,Richard Whyte 將向您解釋如何從您自己的策略管理解決方案的實現的關鍵設計點中受益。他也從提煉為最終建議的簡單設計開始,為策略管理服務的一個版本勾勒了框架,并使其成為可能的解決方案。

            引言

            各公司也正在尋找他們使用及控制技術的方式的改進。業務流程管理(BPM)及面向服務的體系結構 (SOA) 是使得業務靈活、增強業務控制及風險管理的關鍵,并在業務完成主要功能的方式上創建新的機會。

            端對端或直接處理 (straight-through-processing,STP) 體系結構在其邊界接收工作條目并在不影響控制的情況下控制其完成流程。這樣的體系結構可以跨越單一部門、多業務線 (LOB) 或商業組的成員。新的挑戰迫使業務及技術優勢被部分的偏移。

            關鍵的挑戰是在大型的、高可用性的 SOA 實現中有效的引用及配置數據發布。可以通過調查工作量的性質來突出這一點。例如,SOA 需要供給多業務流程。SOA 為不同階段(秒、日、周或年)控制每個流程實例(工作條目),并需要各種資源來完成。條目流由必需使用通用規則及參考數據處理的組工作條目來創建。

            本文討論配置、引用及業務規則發布的解決方案。策略管理是確保策略的服務能被正確、及時及準確通知的動作。它是一種系統開銷,所以必需要操作簡單、高效和經濟的。

            術語策略數據 (policy data)指做業務或技術決定的所有數據類型。在某些情況下錯誤的、過時的或不完全的數據是可以接受的但在其他情況下則不可以接受。策略設置的可見性是嚴格的。例如,沒有時區的時間戳在單一地區的情況下可以接受,但在多地區環境中卻不能。

            為達到本文的目的,策略是由單一單元管理及檢索的一套指定的數據條目(設置)。設置名在策略中是唯一的但可能存在于多個策略中。

            策略是確定的路線或從選擇物中選擇動作的方法,并在給定條件的指引下指導及確定決策。例如,業務策略規定報酬低于 5,000 USD 不作為舞弊檢查的對象。這里的規則及值(5,000 USD)就是策略數據。例如,如果 USD(<Item.Value>) 大于 <Policy.Value>,那么 Do-Fraud-Check







            策略管理顯示

            策略管理解決方案(PMS)顯示為 SOA 提供中央管理策略數據服務。該解決方案負責 SOA 中所有元數據。它提供:

            • 單點控制
            • 相容接口
            • 檢測及保護數據惡化
            • 準確的、完全的及同步的(及時的)為需要它的任何服務發布策略數據
            解決方案的主要原則是:
            • 服務保留響應性和對其策略的控制,但是將管理和保留的職責委托給了專用的 PMS。這將可以確保不用復雜的配置改變而向 SOA 中添加或從其中移除服務。由于服務總可以從策略服務中恢復策略,所以他們可以存在于非錯誤容忍的硬件設備上。元件失效并不導致需要恢復配置信息,以及個性化服務組建可以安全的聚焦于業務及當前工作上而不是策略上。
            • 工作條目“請求”使用策略的版本而不是服務擁有版本。這確保服務可以確信他們使用正確的策略,而不需要進行遠程版本檢查。 可以在任何給定時間激活策略的新老版本,并可以保證任何服務分別為工作條目選擇正確的策略。這也支持服務使用不同的策略需求同時處理不同工作流中的工作條目(隔離工作流)。
            • 不變策略版本及檢查策略數據完整性的能力支持分布及響應環境的優化。它也允許服務的所有實例應用策略版本,而不用考慮其周圍環境。
            • 通過實現責任的明確劃分及清除的、明確的所有權保存,解決方案陳列出一致的策略語法及語義、查看跨多服務策略的能力、簡化的實現及保管成本。
            • PMS 負責管理及分發策略信息,但并不擁有所有策略數據,它只保留個別(客戶端)服務的屬性信息。集中管理允許對策略進行測試、控制改變及將其作為單獨單元移植到產品中。IT 簡化了啟動新服務實例的配置步驟并保證那個服務使用一致的名字及類型管理模式。結果是使用專一的、簡單的管理接口。
            • PMS 應當將它本身及客戶端應用程序間的代碼或操作連接最小化且不能損害獨立性或封裝性(如,Java? 對象版本)。它也不能創建操作依賴性,如爭用或單獨點故障。
            • PMS 提供了可調用的管理接口。這創建了分層的解決方案,它可以權衡 SOA 用戶交互解決方案(瀏覽器、門戶及 Eclipse)。這個方法讓 SOA 為所有服務提供一致的用戶接口。要簡化最初的開發及部署,可能要提供簡單的控制臺,在公布的管理應用程序編程接口(API)中使用服務。此方法不向服務中添加任何限制。







            開發解決方案

            解決方案開發開始于數據結構及創建操作、維護及分發策略數據的軟件。這個解決方案從一個簡單的解決方案發展而來,調整以適合新的問題并根據需要添加功能。結果是該解決方案在不損害 SOA 或導致額外操作成本的情況下滿足需求。


            圖 1. 策略管理開始于軟件的編碼
            策略管理開始于軟件的編碼

            以結構及靈活性為代價換來了最佳性能。由于環境變得很復雜,識別及改變策略的工作也變得費力甚至是冒險。在沒有改變軟件的情況下不能改變策略,并且沒有源代碼時也策略也不可見。嵌入式策略不能被共享,不支持引用數據,不適合封裝解決方案。


            圖 2. 配置庫中的策略設置
            配置庫中的策略設置

            將策略設置放置在軟件本地的配置庫中使得他們更加可見并更容易更改及共享。本地存儲很可能會提供合理的性能且不創建復雜的訪問性及所有權問題。這解決了嵌入式策略的許多限制。本地庫方法當應用程序想通過網絡并彼此依賴來提供及時并準確的服務時會失敗。在無權使用運行時環境或不了解特定主機上是如何存儲及管理策略時,本地配置是不可見的。一般的問題是使用深奧的語法及語義表示配置,需要專門的控制臺或簡單的文本編輯器進行管理,或者是本地配置文件或數據庫不是很容易的能支持企業級范圍的引用數據。


            圖 3. 多實例服務及互關聯分布系統
            多實例服務及互關聯分布系統

            多實例服務及互關聯分布式系統創建過多的所有本地配置的同步。共享庫通常是發布的模式數據庫。引用及配置數據使用復制技術存儲于數據庫中。應用程序使用 SQL 查詢訪問數據。

            這個解決方案在策略庫與使用它的應用程序之間有很強的依賴性。在沒有改變的情況下,模式不能改變且數據庫不能移植到所有的應用程序中。用戶名及密碼經常存儲于各自的應用程序中,但不能在常規基礎上進行改變并且也不安全。

            數據所有權、性能問題及單點故障還有更多普遍的問題都存在于這個解決方案中。性能及可用性方面可以通過創建多的、同步的庫映像來解決。然后需要通過負載均衡避免爭用。

            復制從一個庫將數據操作(插入、更新、刪除)復制到另一個倉庫。使用從數據庫日志文件或數據庫觸發器觸發的存儲并發送 (store-and-forward) 技術將操作發送給復制。標準的復制模型是可升級的且提供使用異步傳輸的“某時”倉庫的同步。它不保證“時間點 (point-in-time)”同步。

            這個 PMS 版本需要所有服務在任意時刻都使用正確的策略,作為解決方案放棄復制其自身。

            同步復制使用分布式事務處理管理復制數據操作,(幾乎)同時的作為工作單點,將操作應用到所有復件。一個的失敗導致所有的失敗。不幸的是,這項技術操作費事且不可劃分。錯誤修正、添加、移除及初始化同步復制都是費事的,且相關操作創建實例間的緊耦合。

            輕量級目錄訪問協議 (LDAP)是正式的目錄訪問協議。實現一般地提供內建的分布式系統,它可以通過跨企業及網絡來實現。LDAP 提供基于標準的層次數據結構,它允許非安全認證應用程序訪問,或通過提供存儲于他們自己目標記錄中的認證訪問。這個基本的模型對 PMS 發布顯示很有用處。它沒有依賴于簡單數據庫方法的用戶名及密碼的依賴,而是提供可擴充的文檔模式。LDAP 使用復制將數據入棧到它的復件中,它不支持服務選擇特定的記錄的修正。

            事件驅動發布是一種解決方案,它依賴于更新記錄的組件登記。這個解決方案不適合那些需要舊策略并將責任推給應用程序的工作條目。入棧技術本身可能不提供顯示需要的準確度。

            數據發布檢查點

            沒有從最終容器返回有意義反饋的數據入棧的復制不能保證每個服務應用正確給定工作條目的策略版本。服務依賴他們本地庫的更新速度,分布式庫及高性能 SOA 增強同步延遲及錯誤策略應用程序的水平。仍留有問題:解決方案如何保證每個服務每次都使用正確的策略修正?解決方案如何保證它包括所有新的及以前的策略版本,并且它能在發布及響應環境中進行操作么?

            PMS 需要工作條目請求特定的版本以允許服務檢查其是否有正確的版本。這個方法可以為舊的及非常新的策略工作。

            現在服務可以顯式請求正確的版本。可以使用復制將其重新移入分布緩存中,策略修正請求保證服務使用正確的版本。

            第一個結構原則是:將每個工作條目標記上正確的策略修正







            標記工作條目


            圖 4. 標記工作條目
            標記工作條目

            原則沒有說明如何完成正確策略修正每個標記工作條目。操作是使用需要運算法則來確定正確版本的一般標簽來標記,或使用顯式的策略修正信息來標記。

            常規標簽是從信息的固有數據或從為策略管理的單獨目的而添加的專用的標簽中創建的。

            固有標簽使用現有數據(例如,日期及時間)并向屬性添加含意。添加的含意對維護工程師及操作人員不會立即變得明確。使用這個方法,就會限制額外內容的靈活性,操作(如,改變已應用的策略版本)也會受到損害。

            專用(非固有)標簽經常從生成器容易獲得的信息中生成。這簡化標簽的生成,但需要查找算法來找出正確的修正或版本。查找可能確定最新的修正,在這之前一天的,兩天之間的或后一天的。這些算法實現起來復雜,當需要的實際修正不在庫中或不符合應用的算法時,查找就會失敗。算法會脫節于從任何特定修正的顯式請求,他們銷毀需要的及不適合的反饋。

            顯式標簽描述對單一顯式策略修正的直接連接。添加他們只是為策略管理的目的。

            SOA 包含許多服務,每個服務中都定義有一個或多個策略且以不同的級別修正。如果解決方案列出工作條目需要的所有策略修正對,那么該解決方案就會變得臃腫且易于出錯和變得混淆。這個方法強制這個標記類型假設每個工作條目需要每個服務及策略。

            通過創建及存儲指定的共同工作的策略修正列表,您可以在 SOA 中創建所有策略的一套相應的特定的修正。然后就有可能用這套策略修正的名字作為顯式標簽而不是作為列表本身。第一個實現原則是:使用策略集合在結構的入口處分別標記每個工作條目。

            策略集合


            圖 5. 映射到策略的策略集合
            映射到策略的策略集合

            將每個策略的一個版本放置在指定的集合中創建策略集合。標記為策略集合的工作條目與那些策略修正有直接的關系。沒有必要將每個修正都列入工作條目中,需要的標簽的數目減少到一個。標記為相同策略集合的工作條目(工作流)組以一致的及可預測的方式使用相同的策略及流程。

            服務可以使用策略集合及策略名顯式的請求他們需要處理的這個工作條目的策略版本。

            策略的一個版本可以存在于許多策略集合中,但一旦它被部署在一個集合中就不能再對其進行修改。對策略的“更新”導致生成及更新了一個新的策略版本。.

            通過使用檢查或數字簽名,易于區分 key-not-found(緩存不完全)與 invalid-key(不進行遠程請求,他們就不會知道彼此)之間的不同,您可以檢查改變及策略的完整性。例如,使用排序代碼和銀行賬戶號碼訪問客戶的簡介。如果沒有找到,使用排序代碼取得該客戶的默認信息。

            成功的策略及策略集合部署確保取得的使用策略名及策略集合的策略總是正確的,沒有過多的開銷或當緩存時沒有緩存合法性問題。

            策略所有權及域

            策略是特定服務的獨有職責及屬性,但可能被那個服務的所有實例所使用。這個限制保護執行的獨立性及簡化變更管理。要保護這個清楚的劃分,PMS 需要提供防止其他小組對策略更新的控制。屬于重實現或不贊成的服務的策略可以被廢棄以保護解決方案的長期合法性。

            一個服務需要用其他服務注冊的情況確實存在(例如,使用報告執行服務注冊報告)。有利的方面是,所有權限制澄清了事件的狀態。首先,報告清楚的保留第一個服務的屬性及職責并被放置在服務的策略當中。PMS 需要報告執行服務訪問那個策略設置的機制。

            域是類或類型并表示數據的規則、語法及語義(例如,它必需是整型、浮點型、圖片類型等等)。域是分配給規則及格式的名字。

            將域添加進策略設置使得策略管理員依據值并識別那個值屬于已知的特定的域來增強那些域規則及格式。策略管理員可以使域允許服務定義新的域。名字及合法性規則是策略設置,域是,例如,PMS$DOMAIN

            取得策略設置的通常的方式是從特定的策略集合中請求策略,并從特定的策略修正中產生所有的設置。PMS 可以通過允許客戶端服務通過域名訪問策略集合中的多個策略取得策略設置來實現一個服務通知另一個策略的能力。例如,Name = My ReportValue = "Report file + instructions."Domain= REPORT

            由域來獲取可以保留正確的所有權規則并可以防止不同服務策略間的交叉。它為服務提供簡單的機制使用其他服務在保留所有權情況下注冊構件。







            實現意見

            對已部署策略的更改會導致在新的策略集合中創建新的策略修正。新策略集合需要被顯式的部署以供產品服務所使用。顯式部署允許更改進行測試、控制及授權。部署檢查所有策略及策略集合,標記他們為不可變。

            服務連接 SOA 在接收工作前取得他們的技術策略,但從工作條目中取得策略集合。新服務不需要顯式策略同步。

            工作條目使用正確的策略集合單獨標記。服務可以支持多并發策略且可以為每個工作條目準確的應用正確的策略。

            當策略集合進入體系結構中,它就被分配給每個工作條目。策略集合是最新的集合、名字集或策略集合分配給特定的工作流。如果策略管理員支持策略集合請求,例如,允許 PolicySet = ""PolicySet = "WS$<Name>"PolicySet = "PolicySetName",處理相同工作流的不同網關不需要相互同步。

            空白策略集合的工作條目被分配給指定的策略集合,通過第一個服務請求該信息。使用最新策略集合的名字,工作條目也被從那一點向前被標記。

            以一個工作流標識符標記的工作條目,使用與命名策略集合相同的方式用工作流 ID 分解。如果工作流 ID 別名已經分配給了策略集合,請求可能會得到本地緩存的回絕。否則,請求救會被送到策略管理服務。服務為策略集合分配別名,以集合及影射作為回應。

            如果不可變約束不合適,必需允許在任意時刻改變策略。如果由數據過期來管理刷新,就像 Web 頁面情況一樣,那么可以使用策略或策略集合內部的關鍵字,來通知任意的緩存,告訴他們數據可以保持多長時間的方式來實現。例如,PolicyCacheDirty 被設置為 "REALTIME",顯示如果策略過期每次都使用 DateTime / DeltaTime 檢查策略的改變。

            當使用過期機制時,可以告知 PMS 使用另外一個關鍵字。例如 PolicyVersionChange 設置為“On Change”顯示改變或新值的增加都會導致策略新版本的產生。







            結束語

            策略被組織為策略集合而發布。策略集合由許多屬于單獨服務的策略組成。每個策略都被命名并歸屬到版本控制中。不能改變已部署的策略,而且都使用了數字簽以允許任何服務檢查它的可靠性和完整性。工作條目通過指定策略集合指示活動策略。三個重要的方面包括:

            1. 可以使用不同的策略處理不同線程處理的多條目。
            2. 策略數據可以被復制或緩存,而且沒有使用過期數據的風險。
            3. 工作條目為其自身請求正確的策略。

            這確保工作條目取得他們需要的策略,并去除對同步服務策略緩存復雜模式的需要。

            策略通過其單獨的、專用服務、強制唯一的、一致的語法及域控制語義來構造、維護及部署。應用到工作條目的策略的預測為企業提供了強大的診斷及管理工具。

            解決方案為業務提供了以受控及可追蹤方式改變策略的能力,及在工業及聯邦法律的約束下實現其公司的管理需要(Sarbanes-Oxley Act 2002)。

            posted @ 2006-04-17 03:06 wsdfsdf 閱讀(124) | 評論 (0)編輯 收藏

            使用 Rational Application Developer 和 WebSphere Application Server 來加速基于 XML 的 SOA 的 JSF 開發——第 1 部分

            本系列文章提出了加快基于 XML 的面向服務的體系結構(Service Oriented Architecture,SOA)應用程序表示開發的解決方案。這種解決方案包括 Eclipse 功能,可以生成靜態類型的用于 XSD Schema 的服務對象數據(Service Data Object,SDO),并提供了在表示元素數據與 XML 數據相互轉換中使用 SDO 的運行框架。

            引言

            松耦合、粗粒度的面向服務的體系結構(Service Oriented Architecture,SOA)應用程序圍繞著 XML 數據交換(XML Data Interchange)開發,它常需要一些表示層的開發。這樣的體系結構的基本需求是表示的綁定控制數據對象以及數據對象與 XML 數據的相互轉換。用于表示開發的現有的框架(如 JavaServer? Faces,JSF)使得數據能夠在屬性的表示元素與 Java? bean 類的引用之間進行轉換。在 XML 與數據對象轉換實現的過程中最乏味的工作留給了開發者,通過使用第三方指定的框架或編寫代碼來實現。

            這個包含五部分的系列文章提出了加快基于 XML 的 SOA 應用程序表示開發的解決方案,并包括 Eclipse 功能使得可以生成靜態類型的用于 XSD Schema 的服務對象數據(service data object,SDO),以及使用 SDO 實現表示元素數據與 XML 數據之間相互轉換的運行框架。

            在該系列文章的第 1 部分中,我們將經歷通過使用提供的插件集來向每個指定的 XML schema 中的服務傳遞信息的簡單 JSF 應用程序的整個開發過程。本文中的應用程序場景進行了一次服務調用——發出一個 XML 請求及收到一個 XML 響應。這個應用程序說明了主從復合結構的數據對象視圖,連同分頁及分類的能力。本文還描述了應用程序在設計時和運行時的體系結構。

            Rational? Application Developer V6 以及 Websphere? Application Server V6 需要利用這種轉換功能。本文假定讀者是精通 Rational Application Developer 的 JSF 頁面設計師。







            安裝 XSD SDO 轉換功能

            1. 下載文件xsdsdotransform-feature.zip 解壓縮到您的 Rational Application Developer 安裝的 rad\eclipse 目錄下(例如,D:\IBM\RSDP\6.0\rad\eclipse)。
            2. 啟動 Rational Application Developer(以下簡稱為 Application Developer)。
            3. 選取 Help => Software Updates => Manage Configuration(如圖 1 所示)。
              圖 1. 功能安裝
              圖 1. 功能安裝
            4. 如圖 2 所示使得 XSD SDO 轉換功能生效,然后重啟 Application Developer。
              圖 2. 功能安裝
              圖 2. 功能安裝
              您可以用 -clean 命令行參數啟動 Application Developer 來確保該功能的配置更新。






            XSD SDO 轉換功能的內容

            XSD SDO 轉換功能包括用于從 XSD schema 中生成 SDO 包的工件,以及用于將 SDO 包實例轉換到 XML 實例文件中或從 XML 實例文件中轉換出 SDO 包實例的框架組件:

            1. 創建 SDO 包的動作
              在 XSD 資源中的這個動作從 XSD schema 中生成了 SDO 包(如圖 3 所示)。
              圖 3. 創建 SDO 包
              圖 3. 創建 SDO 包
            2. dw.ibm.etools.xsd.sdo.xmltransformservice.XMLTransformServiceFactory 類
              該類提供了 API 用于將 SDO 包實例轉換到 XML 實例文件中或從 XML 實例文件中轉換出 SDO 包實例。(可利用 xsd_sdo_soa_part1_listings.zip 下載文件中的 XMLTransformServiceFactory.java 代碼。)







            場景

            我們將要開發一個簡單的保險應用程序場景,來說明主從復合結構的視圖、分類以及分頁功能。在該場景中:

            • 我們假設 XYZ 保險公司有許多已注冊的代理人。
            • 每個代理人都有許多客戶,并且每個客戶都同代理人簽訂了許多策略。
            • 保險公司通過標準的 BrokerService 方案來展示代理人的服務。
            • 任何來源于代理人的信息都是按照清單 1 中定義的方案傳遞的 XML 請求或響應。(可利用 xsd_sdo_soa_part1_listings.zip下載文件中的 BrokerService.xsd 代碼。)

            清單 1. BrokerService.xsd

            												
            														<?xml version="1.0" encoding="UTF-8"?>
            <xsd:schema xmlns="http:///xyz.brokerservice.ecore"
            	xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
            	targetNamespace="http:///xyz.brokerservice.ecore">
            	<xsd:annotation>
            		<xsd:documentation xml:lang="en">
               			Broker Service Schema for xyz.com.
               			Copyright 2004 ibm.com. All rights reserved.
              		</xsd:documentation>
            	</xsd:annotation>
            	<xsd:element name="brokerService" type="brokerServiceType"/>
            	<xsd:complexType name="brokerServiceType">
            		<xsd:sequence>
            			<xsd:element minOccurs="0" name="broker" type="brokerType"/>
            			<xsd:element minOccurs="0" name="error" type="errorType"/>
            		</xsd:sequence>
            	</xsd:complexType>
            	<xsd:complexType name="brokerType">
            		<xsd:sequence>
            			<xsd:element minOccurs="0" ref="firstName"/>
            			<xsd:element minOccurs="0" ref="lastName"/>
            			<xsd:element minOccurs="0" name="loginName" type="xsd:string"/>
            			<xsd:element minOccurs="0" name="loginPassword" type="xsd:string"/>
            			<xsd:element maxOccurs="unbounded" minOccurs="0" name="client" type="clientType"/>
            		</xsd:sequence>
            		<xsd:attribute name="brokerId" type="xsd:string" use="required"/>
            	</xsd:complexType>
            	<xsd:complexType name="clientType">
            		<xsd:sequence>
            			<xsd:element minOccurs="0" ref="firstName"/>
            			<xsd:element minOccurs="0" ref="lastName"/>
            			<xsd:element minOccurs="0" name="dateOfBirth" type="xsd:date"/>
            			<xsd:element minOccurs="0" name="currentAddress" type="addressType"/>
            			<xsd:element minOccurs="0" name="permanentAddress" type="addressType"/>
            			<xsd:element maxOccurs="unbounded" minOccurs="0" name="policy" type="policyType"/>
            		</xsd:sequence>
            		<xsd:attribute name="clientId" type="xsd:string" use="required"/>
            	</xsd:complexType>
            	<xsd:complexType name="addressType">
            		<xsd:sequence>
            			<xsd:element name="street" type="xsd:string"/>
            			<xsd:element name="city" type="xsd:string"/>
            			<xsd:element name="state" type="xsd:string"/>
            			<xsd:element name="zip" type="xsd:string"/>
            			<xsd:element name="country" type="xsd:string"/>
            		</xsd:sequence>
            	</xsd:complexType>
            	<xsd:complexType name="policyType">
            		<xsd:sequence>
            			<xsd:element name="policyName" type="xsd:string"/>
            			<xsd:element name="policyStartDate" type="xsd:date"/>
            			<xsd:element name="policyEndDate" type="xsd:date"/>
            			<xsd:element name="policyAmount" type="xsd:string"/>
            			<xsd:element name="policyDescription" type="xsd:string"/>
            		</xsd:sequence>
            		<xsd:attribute name="policyId" type="xsd:string" use="required"/>
            	</xsd:complexType>
            	<xsd:complexType name="errorType">
            		<xsd:sequence>
            			<xsd:element name="errorCode" type="xsd:string"/>
            			<xsd:element name="errorDescription" type="xsd:string"/>
            		</xsd:sequence>
            	</xsd:complexType>
            	<xsd:element name="firstName" type="xsd:string"/>
            	<xsd:element name="lastName" type="xsd:string"/>
            </xsd:schema>
            
            												
            										


            圖 4. BrokerService 方案模式
            圖 4. BrokerService 方案模式

            在該場景中,我們開發了一個 brokerdetail.jsp JavaServer Faces JSP 頁面。該頁面發出代理人請求的詳細信息(brokerDetailRequest.xml,如清單 2 所示),并收到包含所有代理人的客戶及他們策略的響應(brokerDetailResponse.xml,如清單 3 所示)。每頁顯示一個客戶的詳細信息并且按名將他們的策略分類。


            圖 5. BrokerDetail 請求及響應消息流
            圖 5. BrokerDetail 請求及響應消息流

            (代碼如清單 2 和 3 所示,可 xsd_sdo_soa_part1_listings.zip 下載文件中獲得。)

            清單 2. brokerDetailRequest.xml

            												
            														<brokerService xmlns="http:///xyz.brokerservice.ecore" 
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <broker  brokerId="099-99-9999">
            <loginName>narinder</loginName>
            <loginPassword>makin</loginPassword>
            </broker>
            </brokerService>
            
            												
            										

            清單 3. brokerDetailResponse.xml

            												
            														<brokerService xmlns="http:///xyz.brokerservice.ecore" 
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
            <broker brokerId="000-00-9999">
            	<firstName>Narinder</firstName>
            	<lastName>Makin</lastName>
            	<client clientId="001-00-9999">
            		<firstName>Dan</firstName>
            		<lastName>Moore</lastName>
            		<dateOfBirth>1967-08-13</dateOfBirth>
            		<currentAddress>
            			<street>113 Oak Pine St.</street>
            			<city>Santa Clara</city>
            			<state>LA</state>
            			<zip>91929</zip>
            			<country>US</country>
            		</currentAddress>
            		<permanentAddress>
            			<street>123 Demi Lane</street>
            			<city>Cary</city>
            			<state>NC</state>
            			<zip>22999</zip>
            			<country>US</country>
            		</permanentAddress>
            		<policy policyId="L000000000">
            			<policyName>Life</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>100000.00</policyAmount>
            			<policyDescription>Life Insurance policy includes any 
            				accidental damages.</policyDescription>
            		</policy>
            		<policy policyId="H000000000">
            			<policyName>House</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>50000.00</policyAmount>
            			<policyDescription>Home Insurance</policyDescription>
            		</policy>
            		<policy policyId="C000000001">
            			<policyName>Car 1</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>15000.00</policyAmount>
            			<policyDescription>Car Insurance - Ferrari 2004 - Primary 
            				Car </policyDescription>
            		</policy>
            		<policy policyId="C000000002">
            			<policyName>Car 2</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>5000.00</policyAmount>
            			<policyDescription>Car Insurance - Lexus 2003 - Secondary 
            				Car </policyDescription>
            		</policy>
            		<policy policyId="B000000002">
            			<policyName>Restaurant</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>25000.00</policyAmount>
            			<policyDescription>Business Insurance - Restaurant
            				</policyDescription>
            		</policy>
            	</client>
            	<client clientId="002-00-9999">
            		<firstName>Tom</firstName>
            		<lastName>Cross</lastName>
            		<dateOfBirth>1970-11-11</dateOfBirth>
            		<currentAddress>
            			<street>113 Duke St.</street>
            			<city>Shelton</city>
            			<state>CT</state>
            			<zip>08989</zip>
            			<country>US</country>
            		</currentAddress>
            		<permanentAddress>
            			<street>123 Lex Lane</street>
            			<city>Fairfield</city>
            			<state>NY</state>
            			<zip>09833</zip>
            			<country>US</country>
            		</permanentAddress>
            		<policy policyId="H100000000">
            			<policyName>House</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>2000.00</policyAmount>
            			<policyDescription>Home Insurance</policyDescription>
            		</policy>
            		<policy policyId="L100000000">
            			<policyName>Life</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>100000.00</policyAmount>
            			<policyDescription>Life Insurance</policyDescription>
            		</policy>
            		<policy policyId="C100000001">
            			<policyName>Car 1</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>2000.00</policyAmount>
            			<policyDescription>Car Insurance - Camry 2004 - Primary 
            				Car </policyDescription>
            		</policy>
            	</client>
            </broker>
            </brokerService>
            
            												
            										







            應用程序設計流程

            圖 6 描述了該場景的應用程序設計流程。


            圖 6. 應用程序設計流程
            圖 6. 應用程序設計流程






            運行時的體系結構

            頁面請求時,將發生(如圖 7 所示):

            1. JSF 運行時調用 BrokerDetailRoot bean。
            2. BrokerDetailRoot 通過將 brokerDetailRequest.xml 發送到 BrokerService 來預載數據。
            3. BrokerService 發回響應作為 brokerDetailResponse.xml
            4. 收到的來自于代理服務調用的響應(作為 brokerDetailResponse.xml)被傳遞到 XMLTransformServiceFactory。
            5. XML 被轉換成了包裝在 BrokerDetailRoot bean 中的 SDO。
            6. bean 在 JSF 運行時被處理。
            7. JSF 運行時通過組合的數據給予控制。


            圖 7. 運行時的體系結構
            圖 7. 運行時的體系結構






            實現解決方案

            在下面的部分中詳細地描述了實現這種解決方案的步驟:

            1. 引入項目轉換
            2. 從 XSD schema 創建 SDO 包
            3. 創建基本的根 Java bean
            4. 創建代理服務根 Java bean
            5. 創建 JSF JSP
            6. 向頁面數據中添加頁面 BrokerDetailRoot bean
            7. 向頁面代碼中添加命令方法
            8. 創建頁面上的控制并綁定到頁面數據的 SDO 類型上
            9. 運行 brokerdetail.jsp

            1. 引入項目轉換

              將項目轉換 xsd_sdo_soa_xml_tutorial.zip 下載文件引入到 Application Developer 工作中。結果,下列文件將被引入(如圖 8 所示):

              • XYZInsuranceEAR:企業應用程序項目,它包括作為模版或實用程序的所有其他項目。
              • XYZInsuranceWeb:動態 Web 項目用于所有能夠創建 JSF JSP 頁面的應用程序。該項目的 WebContent 文件夾包括 BrokerService.xsd schema 并且在 Schema 文件夾中含有實例數據文件。為了簡單起見,本實例中 schema 以及 SDO 包都作為 WebProject 的部分。如果需要在多個 Web 項目中共享同一個 SDO,那么您可以為 SDO 包創建獨立的 Java 項目。這個 SDO 包被構建在 XML Schema 所在的同一個項目中。
              • XYZInsuranceService:包括實現代理服務的 Java 類。該服務裝載并發出了與服務方法請求相應的 XML 響應。提供這個基本的實現來模擬服務行為。它的實現超出了文章介紹的范圍。
              • XYZInsuranceServiceProxy:包括用于調用代理服務的 ServiceProxy 的基本的實現。
              下面的部分描述了 XYZInsuranceWeb 項目的額外內容。


              圖 8. 引入的指導項目轉換
              圖 8. 引入的指導項目轉換
            2. 從 XSD schema 中創建 SDO 包

              在 Application Developer 中,右鍵單擊 BrokerService.xsd,然后選擇 Create SDO Package(如圖 9 所示)。


              圖 9. 創建 SDO 包
              圖 9. 創建 SDO 包

              結果,將生成下面的工件(如圖 10 所示):

              • xyz.brokerservicexyz.brokerservice.impl,以及 xyz.brokerservice.util 包括 SDO 及為了適合于 XSD schema 中定義的類型而構建的相關工具的 Java 包。
              • 框架 JAR 文件——xsdsdotransform.jar,它被添加到 EAR 項目并且 Web 項目的 JAR 依賴被相應地更新來建立運行時的類路徑。


              圖 10. 生成的 SDO 包
              圖 10. 生成的 SDO 包

              包名來源于 XSD 中聲明的定義在 schema 中的 targetNamespace(如圖 11 所示)。


              圖 11. TargetNamespace 聲明
              圖 11. TargetNamespace 聲明
            3. 創建基礎的根 Java bean

              brokerservice.root 包中創建 BaseBrokerServiceRoot.java(可從 xsd_sdo_soa_part1_listings.zip 下載文件中獲得)Java 類作為所有頁面根 bean 包裝器的基本類。SDO 包的 schema 命名空間的注冊工作在靜態塊中完成。運行時,檢查 XML 實例文檔的命名空間來在這個注冊表中定位相關的 SDO 包:

              static{
              	EPackage.Registry.INSTANCE.put(
              		BrokerservicePackage.eINSTANCE.getNsURI()
              		, BrokerservicePackage.eINSTANCE);
              }
              

            4. 創建代理服務根 Java bean

              創建 BrokerDetailRoot.java(可從 xsd_sdo_soa_part1_listings.zip 下載文件中獲得)Java 類,使其作為 BrokerDetail.jsp 頁面的 bean 包裝器。這個 bean 包裝了 SDO 包,并使得 SDO 包的用法如同頁面數據中的 Java bean。它也包括通過對請求的服務調用的響應來預載 bean 的方法:

              1. 創建方法
                在此實例中,該方法只是簡單地返回了 XML 請求字符串,然而將其編碼用來調用請求創建者服務(例如,由于需要審核的服務,所以向 XML 請求中添加適宜的頭信息,等等)。

                protected String createBrokerDetailRequest(){
                	String request = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
                		<brokerService mlns=\"http:///xyz.brokerservice.ecore\"
                		xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">
                		<broker brokerId=\"099-99-9999\"><loginName>narinder</loginName>
                		<loginPassword>makin</loginPassword></broker></brokerService>";
                	//you may also use the create/convert API to create a new request string
                	/*DocumentRoot docRoot = (DocumentRoot)
                		XMLTransformServiceFactory.INSTANCE.create(BrokerservicePackage.eINSTANCE.getNsURI());
                	BrokerServiceType bs = docRoot.createBrokerService();
                	xyz.brokerservice.BrokerType b = bs.createBroker();
                	b.setBrokerId("099-99-9999");
                	b.setLoginName("narinder");
                	b.setLoginPassword("makin");
                	request = XMLTransformServiceFactory.INSTANCE.convert((DataObject)b);
                	*/
                	return request;
                }



              2. 加載方法
                調用 XMLTransformServiceFactory 方法將代理的詳細的響應 XML 轉換成 SDO。

                protected void loadBrokerDetailResponse(String response){
                
                	DocumentRoot docRoot=
                	  (DocumentRoot) XMLTransformServiceFactory.INSTANCE.load(response);
                	brokerServiceRoot =  docRoot.getBrokerService();
                }
                



              3. 預載方法
                調用請求及處理響應的服務。

                protected void preLoadBrokerDetail(){
                    String xmlData = createBrokerDetailRequest();
                    String response =
                    	BrokerServiceFactory.invoke(xmlData,
                		BrokerServiceFactory.BROKERDETAIL_REQUEST);
                    loadBrokerDetailResponse(response);
                }
                



              4. sortByPolicyName 方法
                通過使用策略集中的名稱將策略分類。

                public void sortByPolicyName(List listPolicies){
                	ObjectUtil.INSTANCE.sort(listPolicies,
                		BrokerserviceFactory.eINSTANCE,
                		BrokerservicePackage.eINSTANCE.getPolicyType_PolicyName(),
                		true);
                }
                



              5. dw.ibm.etools.xsd.sdo.xmltransform.util.ObjectUtil 助手類
                提供了框架代碼來將列表分類。

                /**
                 * Sorts the Objects in the list
                 * @param list the instance of the EList containing EObjects
                 * @param eFactory the instance of the SDO factory
                 * @param sortBy the EAttribute to be used for sorting
                 * @param desc true for descending sort, false for ascending
                 * @return true if the order of objects in list is changed
                 */
                public  boolean sort(List list, EFactory eFactory
                	, EAttribute sortBy, boolean desc);
                

            5. 創建 JSF JSP

              創建 JavaServer Faces JSP 文件作為 brokerdetail.jsp

              1. 在 Application Developer 中,打開 Web 站點向導,從面板中拋出新的頁面,并將其重命名成 brokerdetail.jsp
                圖 12. Web 站點向導
                圖 12. Web 站點向導
              2. 在頁面上雙擊并作為 Faces JSP 來實現它。
                圖 13 brokerdetail.jsp
                圖 13 brokerdetail.jsp

            6. 將頁面 BrokerDetailRoot bean 添加到頁面數據中

              BrokerDetailRoot bean 包裝了由 XSD 生成的 SDO 類。該 Java bean 是自省的,并且頁面數據以樹的形式展示了 SDO 類型、屬性及引用。下面的步驟用于將根 bean 添加到頁面數據中:

              1. 在頁面數據視圖中單擊右鍵,并通過選取 New => JavaBean 來添加新的 Java Bean(如圖 14 所示)。
                圖 14. 在頁面數據視圖中的新 java bean 菜單
                圖 14. 在頁面數據視圖中的新 java bean 菜單
              2. 在 Add JavaBean 對話框(如圖 15 所示)中輸入 JavaBean 實例的名稱作為變量——varBrokerDetailRootBean
                圖 15. Java bean 屬性
                圖 15. Java bean 屬性
              3. 選擇 Finish。新創建的 bean 將顯示在頁面數據視圖(如圖 16 所示)中。
                圖 16. BrokerServiceRoot java bean
                圖 16. BrokerServiceRoot java bean

            7. 為頁面代碼添加命令方法

              編輯 BrokerDetail.java 頁面代碼文件并將下面的方法用作命令動作的方法。這個動作調用了頁面根 bean 中的 sortByPolicyName 方法通過名稱來為策略的顯示數據分類。(被訪問的 table2 控制被加到了下面的部分中。)您可以創建一個用于策略列表的參數變量,并且使用它而非通過 table 控制來訪問該列表。

              public String doSortByPolicyNameAction(){
              	//table2 is the policy data table
              	//you may choose to add a param scope variable
              	//for policy list, instead of using the table control
              	getVarBrokerDetailRootBean().sortByPolicyName
              		((java.util.List)getTable2().getValue());
              	// returning empty string re-displays the same page with same data binding
              	return "";
              }

            8. 創建頁面上的控制并綁定到頁面數據的 SDO 類型上

              您可以設計頁面的根數據并且使得頁面編輯器為您創建基于已設計好的數據類型的控制,或者您也可以放棄個人控制并親自綁定數據元素。為了簡單起見,我們將使用頁面編輯器來創建這些控制。創建數據表并與每個 SDO 類型綁定,創建輸出文字字段并將其與每個屬性及在這些類型中的單一值的引用相綁定。對于每個多值引用而言,需要創建并綁定嵌套的數據表。

              1. 從頁面數據視圖中拖動 broker SDO 并將其交付給頁面編輯器(如圖 17 和 18 所示)。
                圖 17. Broker SDO
                圖 17. Broker SDO

                圖 18. 頁面設計器
                圖 18. 頁面設計器
              2. Depth 屬性決定了嵌套表格控制創建的深度。將深度設置為 5 可以自定義表格屬性(如圖 19 所示)。
                圖 19. 數據表格屬性
                圖 19. 數據表格屬性
              3. 為“客戶”列表指定數據類型(如圖 20 所示)。如果您希望將列表屬性綁定到頁面上的任何控制中去,就需要提供每個列表屬性的數據類型。
                圖 20. 客戶集的對象類型
                圖 20. 客戶集的對象類型
              4. 通過取消選定 clientAsArray 屬性來定制代理的設計屬性(如圖 21 所示)。
                圖 21. 定制代理設計
                圖 21. 定制代理設計
              5. 單擊...,它顯示在客戶屬性之后(如圖 21 所示)并為“策略”列表指定數據類型(如圖 22 所示)。
                圖 22. 策略集的對象類型
                圖 22. 策略集的對象類型
              6. 自定義“客戶”設計屬性并取消選定 policyAsArray 屬性(如圖 23 所示)。
                圖 23. 自定義客戶設計
                圖 23. 自定義客戶設計
              7. 選擇 Finish。創建頁面控制并將其綁定到根 bean 的元素中去(如圖 24 所示)。
                圖 24. 建立控制
                圖 24. 建立控制
              8. 將您選擇的頁面控制添加到客戶表中,并且設定每頁顯示 1 行(如圖 25 和 26 所示)。
                圖 25. 顯示選項
                圖 25. 顯示選項

                圖 26. 附加的頁面控制
                圖 26. 附加的頁面控制
              9. 為政策數據表格添加命令按鈕并將按鈕的標簽改成 SortByPolicyName(如圖 27 所示)。顯示政策數據表格的頁腳,使您能夠放置命令按鈕(如圖 28 所示)。
                圖 27. 命令按鈕
                圖 27. 命令按鈕

                圖 28. 附加的命令按鈕
                圖 28. 附加的命令按鈕
              10. 將命令按鈕綁定到 doSortByPolicyNameAction 上(如圖 29 所示)。如果沒有顯示“action”屬性,那么將顯示數據表格的所有屬性。
                圖 29. 將命令綁定到動作上
                圖 29. 將命令綁定到動作上
                這里展示的分類機制是服務器端通過調用命令動作來分類的。基于您的需求,您可以選擇在客戶端實現這個分類。

            9. 運行 brokerdetail.jsp

              1. 在 Application Developer 中,右鍵單擊 brokerdetail.jsp 并選擇 Run On Server。(如果沒有提示您啟動服務器,那么先啟動服務器,然后在運行頁面之前向服務器中添加 XYZInsuranceEAR 項目。)
              2. 測試容器中頁面的 URL 是(或者類似于):http://localhost:9080/XYZInsuranceWeb/faces/brokerdetail.jsp
                圖 30. brokerdetail.jsp
                圖 30. brokerdetail.jsp
              3. 對于客戶而言,使用頁面控制來控制頁面。
              4. 選擇 SortByPolicyName 命令通過名稱來將政策分類。







            結束語

            在本系列文章的第 1 部分中,我們提出了加快 JSF 開發的解決方案用于基于 XML 的 SOA 應用程序。這個解決方案提供了 Eclipse 功能以及框架工具,在設計時可用其將 XML Schema 轉換成包括靜態服務數據對象的 Java 包,在運行時可用其將 XML 實例文件與這些 SDO 相互轉化。SDO 包裝成 JavaBean,連同 JavaServer Faces 一起被用于表示開發。本文也提供了對于基本的保險應用程序的場景開發 JSF 表示的通用步驟,包括主從復合結構的視圖、分類及分頁能力。

            在該系類文章中的第 2 部分,擴展了第 1 部分中開發的解決方案,包括新建、更新以及刪除的功能,包括用本地附加的變量及基本的轉換來自定義生成 SDO。該文章將舉例說明多 schema 模型、對于單一頁面中多個請求及響應的場景,并且說明綁定 XML 數據的 JSF 下拉式控制。

            在該系列文章中將介紹:

            • 第 3 部分將描述操作已生成的 SDO 以及自定義 XML-SDO 轉換器的高級技術。它也提供了聚集方法(sun、mean、average 等)的工具,這些方法是對SDO 對象及集合的一般操作。
            • 第 4 部分重在使用 XSDO SDO 轉換功能進行基于 XML 的 SOA 的 portlet 開發,為 JSR 168 portlet 新建的對象尋址、portlet 的參數傳遞,以及在任何其他 portlet 中的 portlet 動作上動態地設置對象 portlet 視圖。
            • 第 5 部分將討論使用 XSDO SDO 轉換功能使 JSF 及基于 XML 的 SOA 的 portlet 應用程序局部化,并且提出基于首選地點顯示的靜態及動態內容。








            下載

            描述 名字 大小 下載方法
            Download file 1 xsd_sdo_soa_xml_sample.zip 727 KB ?FTP|HTTP
            Download file 2 xsd_sdo_soa_xml_tutorial.zip 685 KB ?FTP|HTTP
            Download file 3 xsdsdotransform-feature.zip 727 KB ?FTP|HTTP
            Download file 4 XYZInsuranceEAR.zip 725 KB ?FTP|HTTP
            Download file 5 xsd sdo soa part1 listings.zip 8 KB ?FTP|HTTP

            posted @ 2006-04-17 03:04 wsdfsdf 閱讀(435) | 評論 (0)編輯 收藏

            SOA助企業激活傳統應用

            本文說明 SOA 如何幫助企業將遺留的軟件和信息資產應用在新的業務系統中。

            不知道您是如何定義將企業遺留的軟件和信息資產應用在新的業務系統中這個過程的?我已經聽過好幾個說法了,包括:企業現代化(enterprise modernization)、舊資產轉換(legacy transformation)、舊資產激活(legacy enablement)、舊資產現代化(legacy modernization)等等。我懷疑您聽到的甚至更多種說法,但都是這些詞語的排列組合,當然也許還有一些新詞。在我列出的描述中,我喜歡第三個:舊資產激活(legacy enablement)。雖然對于某些人來說,"舊資產"(legacy)這個詞有負面內涵,但實際上不應當是這樣的。

            舊資產軟件是以前安裝的軟件以及十多年以前就有的軟件。該軟件很有可能正在運行關鍵的業務過程。它可能是企業在合并或并購之后進來的。當一個有沒什么經驗的廠商告訴您需要替換該軟件時,可能正是這個過時的軟件使您開懷大笑。

            基本上來說,"舊資產"是指部署在基礎結構中的現有IT資產。通常,它對業務有重要的價值。要想認識舊資產軟件的重要性,請看這樣的事實:據估計,目前存在2000億行COBOL代碼,而全世界70 %的業務數據是由COBOL應用程序處理的,并且每天要處理300億個基于COBOL的交易。顯然,這些程序都是可以利用的、非常有價值的資產。

            在維護舊資產系統方面,存在成本和競爭力問題。大型部署大都是昂貴的,并且對新的或替換解決方案進行投資也會同樣昂貴。這意味著,為了同時維護舊的和新的系統,可能有不必要的重復,而且從事開發任務的員工必須具備異常廣泛的技能。

            從業務和競爭力角度,我們可以用一個詞來概括其要求:速度。業務需要迅速響應市場機會,并第一個推向市場。同時,業務需要可縮放、可靠和安全的生產性應用程序。單獨依靠舊的或新的技術不可能獲得成本有效、完整或足夠靈活的解決方案,也就無法向客戶交付所需的服務質量。在新舊技術之間需要有一座橋梁,它可以不斷擴展現有資產,同時還能提供像Web服務這樣的新技術。幸運的是,現在已經有了這樣的橋梁,它稱為"面向服務體系結構"(SOA)。

            在SOA世界里,完成業務任務的方式是執行一系列"服務"以及具有良好定義的與服務的交談方式的作業,還有良好定義的交談取消方式。只要服務按期望的方式做出響應,并提供了他或她所需要的服務質量,那么,對用戶來說,服務是如何實現的并不重要。這意味著,服務必須足夠安全、可靠和快速。這樣,在部署了多個廠商的軟件和硬件的IT環境中,或者在一個現有資產與新的應用程序、集成技術或數據源混合在一起的企業中,SOA成為近乎理想的方式。

            有很多企業和IT得益于使用SOA實現的舊資產激活。在業務方面第一位的需要是從現有資產和系統創造新的價值,通常這需要利用新的業務過程和復合的應用程序(例如,門戶應用程序)來實現。SOA可以幫助客戶實時地訪問先前的批處理事務,由此提高做出業務決定的速度和準確性。通過SOA來重復使用關鍵業務數據和應用程序有助于提供更好的客戶服務,從而提高這些客戶保持率。

            另一方面,SOA允許在重新確定關鍵過程和數據的方向時利用優異的服務質量。此外,SOA可以幫助您擴展并保護現有的舊資產投資和開發人員技能,同時幫助您與您的企業以及客戶、伙伴和提供商所使用的其他系統建立更好的互操作性。

            您可以更好地利用舊的和新的世界,以便在繼續利用現有資產的同時利用新的技術進步。當您開始這樣做時,您將逐步使您的企業更靈活、能夠更好響應機會,更好地服務于您的客戶,并改進您的操作。這就是我們稱為按需生產型企業的內涵,并且SOA可以使您的舊資產基礎結構以新的和更好的方式,繼續為您工作。

            posted @ 2006-04-17 02:54 wsdfsdf 閱讀(104) | 評論 (0)編輯 收藏

            七問 SOA

            對于SOA,尤其是像開發人員和CIO等仍有若干關鍵問題需要回答。

            Web 服務以及越來越多的面向服務架構(Service Oriented Architecture,SOA)已經在市場上投放了大量廣告。兩者都可以給企業帶來廣泛的短期和長期利益。但對于SOA,尤其是像開發人員和CIO等仍有若干關鍵問題需要回答。

            問:SOA的前提是能夠使應用程序像服務那樣工作。軟件如何像服務一樣工作呢?

            答:沒有SOA,軟件包是被編寫為獨立的(self-contained)軟件,即在一個完整的軟件包中將許多應用程序功能整合在一起。實現整合應用程序功能的代碼通常與功能本身的代碼混合在一起。我們將這種方式稱作軟件設計"單一應用程序"。與此密切相關的是,更改一部分代碼將對使用該代碼的代碼具有重大影響,這會造成系統的復雜性,并增加維護系統的成本。而且還使重新使用應用程序功能變得較困難,因為這些功能不是為了重新使用而打的包。

            SOA旨在將單個應用程序功能彼此分開,以便這些功能可以單獨用作單個的應用程序功能或"組件"。這些組件可以用于在企業內部創建各種其他的應用程序,或者如有需要,對外向合作伙伴公開,以便用于合作伙伴的應用程序。

            "服務"的概念是要使用與實施細節無關的標準化接口來構建這些"組件"。針對一套應用程序服務的Web服務描述語言文檔,描述需要作為請求特殊服務(例如,"檢查庫存"功能可能需要零件數)輸入來傳輸的數據名稱和類型,并描述服務響應的細節(它可能返回表示庫存中零件數量的一個整數)。

            這些詳細信息看上去好像與 Java、C++、COBOL 等中實施的功能相同,因此,服務的請求程序無需知道使用的何種語言,而且可以使用任何語言來編寫請求程序。這就使一個平臺上的服務可以和為另一個平臺編寫的應用程序集成。互操作性的關鍵是請求和響應消息,例如,使用SOAP消息發送,其消息使用 XML 編寫代碼。

            問:請舉例說明 SOA 如何使企業受益。

            答:關鍵的優勢是互操作性,可以使用任何平臺之間的功能,而與編程的語言、操作系統和計算機類型等等無關。在上述示例中,"檢查庫存"功能可能已經編寫為一個應用程序要求的服務,例如,監控庫存并在需要時自動重新定購的服務,但我們后來發現,同樣的服務無需修改即可用于支持由員工使用的基于 Web 的庫存監控工具。

            就內部而言,應用程序的重復使用是一項關鍵優勢,因為它可以降低開發成本。服務的重復使用,其長期作用在于減少企業中冗余的功能,簡化基礎架構,從而降低維護代碼的成本。通過按服務的使用者來組織應用程序,與傳統的編程技術相比,我們獲得一個要靈活敏捷得多的集成模型,使我們可以迅速修改業務流程模型。

            就外部而言,為服務交互而詳細定義的"合同"使業務合作伙伴之間的交互"自由聯合",提供集成所必需的穩定性,并提供更改基層軟件(underlying software)問題的一個解決方案。當保留了相同的消息格式時,支持該格式的軟件只要仍然支持消息合同,則可以按需進行更改。只要它支持相同的消息格式,甚至可以使用另一種編程語言的實施來完全替換系統,請求程序無需更改。當消息合同不斷發展而必須更改時,與相當困難的任務,即支持多個版本的程序 API 和文件格式相比,它使用版本控制(versioning),更容易作為過渡策略支持多個版本的應用程序。

            這些是部分關鍵益處,還有許多其他益處。

            問:SOA與Web服務以及SOA和網格計算之間是何關系。

            答:SOA是一種面向業務應用程序系統的體系架構設計風格,但可以應用于其他系統,包括中間件技術,例如網格計算。

            Web服務是可以用于創建SOA的一套標準。盡管沒有Web服務標準也可能創建SOA(例如,在SOAP之前,人們已經在HTTP或JMS上使用XML來實現相似的結果),但運用Web服務標準卻是我們目前針對與外部軟件交互的最佳方法。

            網格計算是一種系統管理策略,其目標是最大限度地減少硬件資源的使用。例如,當突然的需求溢出指定的服務器時,它可能臨時將一些請求轉向相對沒那么繁忙的服務器。網格計算設計為一種面向服務架構(用于調整網格計算的服務叫做網格服務)。

            隨著我們轉向SOA,我們將看到該方法用于支持各種其他新的系統功能。另外一個示例是自主計算伙子管理系統。事實上,SOA是Web服務高級功能的基礎,例如WS-Trust和聯合身份識別管理規范。

            問:因為還沒有通用互操作性標準,SOA最大的問題不仍然是供應商中心性(vendor-centricity)嗎?

            答:有一些基本標準正好適用于Web服務,它們可以用于實施面向服務架構。XML和XML方案分別自1998年和2001年就已成為標準。SOAP 1.2自2003年6月成為標準。UDDI在2003年夏天標準化。WS-Security在2004年4月成為標準。

            除了著名標準機構(例如W3C和OASIS)支持的這些正式標準以外,許多"技術建議書規范"也被廣泛接受,并作為事實標準得到充分支持。例如,直到 W3C完成WSDL 2.0為止,要求在其產品中支持Web服務的大多數供應商都支持WSDL 1.1規范。

            事實上,目前大部分軟件供應商對Web服務標準的支持,已導致使用Web服務來廣泛實施SOA。

            問:SOA如何影響SLA?而您如何讓SLA適合您的SOA?

            答:當前企業之間的SOA實施通常側重于改善合作伙伴之間現有業務的效率。同樣,性能保證的概念并不是像方便的互操作性和自由聯合集成那樣的問題,它們可以借助Web服務標準來實現。

            當服務成為企業付費的產品時,對特定水平的性能或可用性的保證,以及其它服務質量注意事項具有更為重要的作用。我們可以想象這在將來會成為一個常見要求,正在進行這方面的工作以支持該模型。

            問:我如何著手構建 SOA?

            答:最佳的方法時開始構建較小的SOA,側重于提高當前缺乏效率的交互性。例如,假設使用一個系統上需要重新鍵入到另一個系統的打印報告,將兩個計算機系統緊密聯系在一起,這會消耗時間、浪費成本,導致出錯,而且數據無法保持罪行。可以設計一個簡單的基于Web服務SOA項目,直接鏈接信息,將含更新的SOAP消息發送到合作伙伴系統,而不是打印報告。

            開始簡單的SOA使企業可以在作出大投資之前先衡量ROI,并在出現大的問題之前獲得小改善的經驗。

            CIO在購買軟件時應該詢問供應商關于對Web服務和SOA的支持,作為一個重要的注意事項。應該檢查新應用程序的開發,以便考慮是否某些應用程序功能可能需要用于其他目的,以及可以嵌入對Web服務標準的支持以支持重復使用。

            最終要完成大規模的企業轉型,可能需要通過建立企業服務總線(形成SOA的骨干網或神經系統)來開始該工作。然后以企業合理的節奏,將服務提供商何服務請求程序逐漸添加到ESB。隨著IT的SOA的增長,ESB成為在服務水平上連接應用程序,并調節消息流量以提高效率和可靠性的一種有力方式。

            問:管理SOA需要哪些新的服務管理技能?

            答:在運用Web服務之前,因缺乏標準和自由聯合的策略,合作伙伴整合受到嚴重限制。隨著我們開始使用Web服務和SOA來整合合作伙伴,我們可以發現,使用業務合作伙伴所提供的功能的IT系統已經開始依賴于這些功能的可用性。我們從內部管理我們自己服務的可用性轉向要求監視和管理(可能有許多)企業之間的可用性。這明顯大大增加了管理IT系統的復雜性,但它也帶來了巨大的價值,這就是為什么許多企業要轉到這個方向的原因。

            Web應用程序系統正在不斷發展以支持Web服務標準。"Web服務分布式管理"或WSDM標準正在由OASIS開發,對Web服務管理提供標準化的支持,通過使用Web服務來實現對不同平臺的管理,滿足涉及獨立業務實體的大規模SOA對分布式管理的要求。

            posted @ 2006-04-17 02:53 wsdfsdf 閱讀(116) | 評論 (0)編輯 收藏

            僅列出標題
            共19頁: First 11 12 13 14 15 16 17 18 19 
            久久99这里只有精品国产| 久久精品亚洲一区二区三区浴池| 久久国产成人精品麻豆| 青青青青久久精品国产h| 精品国产综合区久久久久久| 久久综合伊人77777麻豆| 久久久久亚洲av成人网人人软件 | 久久av无码专区亚洲av桃花岛| 久久精品午夜一区二区福利 | 无码国内精品久久人妻| 国产精品岛国久久久久| 香蕉aa三级久久毛片| 久久久久亚洲Av无码专| 亚洲精品99久久久久中文字幕| 欧洲精品久久久av无码电影| 久久精品无码免费不卡| 精品无码久久久久国产| 久久只这里是精品66| 草草久久久无码国产专区| 狠狠精品久久久无码中文字幕| 嫩草影院久久99| 久久久久久国产a免费观看黄色大片| 国产精品一久久香蕉国产线看| 久久只有这精品99| 久久久久久免费一区二区三区| 亚洲七七久久精品中文国产| 国产三级观看久久| 国产精品久久久久aaaa| 精品久久久久成人码免费动漫| 99久久综合狠狠综合久久| 久久精品无码专区免费青青 | 久久综合久久性久99毛片| 国产精品99久久免费观看| 伊人久久久AV老熟妇色| 久久香综合精品久久伊人| 伊人久久大香线蕉综合网站| 欧美国产成人久久精品| 久久久久国色AV免费观看| 久久精品成人免费观看97| 欧美色综合久久久久久| 久久久精品国产免大香伊|