通過Java編程處理XML 服務SOA

來源:互聯網
上載者:User

 很多大型軟體供應商還在開發各自的 SOA 產品。因此,SOA 領域目前綜合了各種技術,包括 Java Business Integration (JBI)、Intelligent Event Processing 和 Business Process Execution Language (BPEL) 伺服器。因此,在將各種技術融入到一個解決方案之前,想要從 SOA 中受益的使用者組織很可能需要進行大量投資。通過對 SOA 布置如此高的複雜性,行業提前為實現供應商定位鋪好了道路,即使 SOA 其中的一項承諾是實現基於標準、面向組件、獨立於供應商的計算。在開始代價高昂的遷移過程前,使用者組織能夠獲得一些實用的 SOA 使用體驗嗎?

    為回答這個問題,本文通過簡單的 XML 和一些 Java 代碼示範了幾個重要的 SOA 原理。本文並不打算介紹 SOA 領域中的所有內容;相反,我們只介紹其中的一些關鍵區段。例如,您可以考慮使用 RSS 發布 XML 服務定義。但是,在本文的例子中,傳輸機制使用的是 Java 工具。

    Java 技術和 XML

    Java 技術和 XML 幾乎成為了同義字。實際上,我通過 IBM 工具對整篇文章應用了 XML 格式。儘管 XML 取得了顯而易見的巨大成功,仍需注意 XML 是一種相當笨拙的技術,例如 和 標籤會增加大量頻寬並在通過網路傳輸資料時處理系統開銷。然而,忽略這種特性,XML 確實提供了一些強大的處理工具。這些工具(本文將探討其中的兩種)基本上解決了資料表示和解析問題(後者長久以來一直難以解決)。現在,通過使用 XML 工具,各種技術層級的程式員都可以實現專業的標準化解析。

    Java 技術為 XML 資料處理提供了一些真正強大的工具(請參見側欄 Java 技術和 XML)。如果將 清單 1 中的內容看作是給定資料集的基於 XML 的呈現,那麼您還可以使用其他方式進行呈現。構成 清單 1 基本內容的未經處理資料一般儲存在資料庫中。因此,您如何將這些資料打包成 XML?

    這種聚焦式方法的優點就是使用者組織中的 Java 開發人員可以使用其中的理念構建自己的簡單的實驗性 SOA。這種實驗模式有助於組織實現 SOA 的商業效益。後者包含對商務服務建模,例如計算服務、使用者自助服務、更好的自動化服務和更具響應性的服務。您可以將上述的遷移作為一個獨立實驗實現,與現有商務程序並行運作。

    使用者組織不需要進行大型投資就可實現一個實驗性質的 SOA。通過這種方式,陳述特定於組織的 SOA 需求時可以脫離任何供應商實現。實際上,某些較小的使用者組織可以繼續使用他們的實驗性 SOA 模式,只在後期遷移到軟體供應商提供的大型商用解決方案。

    自助服務趨勢

    對於大多數服務提供者來說,自助服務正在發展為一種趨勢 — 特別是那些資金緊張的 ISP。因此,如果您需要更多頻寬(進行下載或玩線上遊戲),您可以登入到供應商的 Web 網站並通過 Web 頁面自動升級與供應商的串連。讓我們看一個具體的例子:清單 1 展示了一個簡單的基於 XML 的使用者服務設定檔。

    清單 1. 一個簡單的基於 XML 的服務描述

    < ServiceInstance>

    < Customer>Josephine Bloggs< /Customer>

    < Package>Internet< /Package>

    < Bandwidth>1mbps< /Bandwidth>

    < DownloadLimit>1Gbyte< /DownloadLimit>

    < Uptime>95< /Uptime>

    < /ServiceInstance>

  代碼解釋了這個使用者 XML 服務模型。該模型包括:

    一個服務執行個體

    客戶名字

    服務包的名稱

    已配置的頻寬量

    每月允許的下載限度

    供應商正常已耗用時間保證

    無疑,服務定義可以比此處的例子複雜很多。其他內容可能包括客戶地址、賬單明細、往返延遲、加密和服務信用資訊等。重點是,越來越多的供應商提供如 清單 1 所示的 Web 存取細節。某種程度上講,這種嘗試可以減少支援電話的花銷和發生頻度。有趣的是,這種基於 Web 的服務可以使使用者覺得為他們提供服務的是較為先進的供應商。這實現了雙贏的局面,因為客戶可以更好地訪問他們的服務資料,而供應商可以銷售無需他們插手的服務包。授權的使用者可以修改如 清單 1 所示的一些服務參數 — 例如,配置的頻寬。隨之修改的是使用者每月的訂購費用。

    因此,清單 1 中的代碼形成了基於 XML 的服務模型的基礎。通過簡單地與線上表單進行互動,使用者可以修改可寫的服務元素(例如頻寬)。通過線上表單進行的修改將被記錄,然後反映到可由使用者設定檔修改的後端服務中。這是一種實現自助服務的標準方法。

    然而,您將要瞭解的是另一種更加鬆散耦合的自助服務 — 使用這種服務,使用者可以通過在網路中傳輸 清單 1 中的 XML 內容修改資料。在這種情境中,所傳輸的 XML 內容可通過一個 Java 客戶機進行修改,後者可運行在台式機、膝上型電腦、甚至某種資源受限的裝置上(例如手機),然後將資料發回給網路服務供應商。這種機制超越了基本的 HTML 頁面模型並採納了 SOA 思想。

    將服務定義 XML 文檔傳輸給使用 Java 技術的客戶機

    清單 2 中的內容摘取自本文附帶的 Java 檔案 encodeXML.java.(相關檔案可從 下載 部分獲得)。encodeXML.java 類對 XMLEncoder 類的對象進行了執行個體化。如您所見,這個對象隨後在目前的目錄中建立了名為 xmldata.xml 的檔案。下一步是將 XML 資料值插入到檔案中,這可以通過調用一連串的 writeObject() 方法實現(清單 2 對此進行了說明)。顯然,在生產環境中,清單 2 中硬式編碼文本字串將來自資料庫這樣的持久性儲存。無論何種情況,可以看到 XML 資料檔案的建立非常簡單。

    清單 2. 使用 XML 格式編碼資料

    XMLEncoder e = new XMLEncoder(

    new BufferedOutputStream(

    new FileOutputStream("xmldata.xml")));

    e.writeObject("Josephine Bloggs");

    e.writeObject("Internet");

    e.writeObject("1mbps");

    e.writeObject("Gbyte");

    e.writeObject("295");

    e.close();

    執行 清單 2 中的程式後,程式的執行目錄中將出現一個名為 xmldata.xml 的檔案。清單 3 解釋了新建立檔案包含的內容。

    清單 3. 產生的 XML 資料

    < ?xml version="1.0" encoding="UTF-8"?>

    < java version="1.5.0_06" class="java.beans.XMLDecoder">

    < string>Josephine Bloggs< /string>

    < string>Internet< /string>

    < string>1mbps< /string>

    < string>Gbyte< /string>

    < string>295< /string>

    < /java>

    您可以通過網路將 清單 3 中的檔案傳輸給等待狀態中的客戶機 — 使用 Java 技術即可建立。清單 4 展示了一個簡單的例子。

    清單 4. 跨越網路傳輸檔案

    byte[] bytes = new byte[BUFFER_SIZE];

    FileInputStream inputFile = null;

    try

    {

    File file = new File("xmldata.xml");

    if (file.exists())

    {

    inputFile = new FileInputStream(file);

    int ch = inputFile.read(bytes, 0, BUFFER_SIZE);

    while (ch != -1)

    {

    output.write(bytes, 0, ch);

    ch = inputFile.read(bytes, 0, BUFFER_SIZE);

    }

    }

    清單 4 中的代碼建立了一個長度緩衝區 BUFFER_SIZE。 BUFFER_SIZE 常量的值可以是 1024 或更高。通過調用 inputFile.read() 方法將輸入檔案(xmldata.xml)的內容讀取到緩衝區中。進行緩衝之後,output.write() 方法將檔案資料寫入到 OutputStream 對象的通訊端中。最後一步將資料通過網路發送到等待中的客戶機中。這些功能居然只需要這麼少的代碼!

    接下來,您需要使客戶機處理傳入的 XML 資料。

    接收資料的 Java 客戶機獲得 XML 內容(並不是 XML 檔案)

    客戶機如何接收 XML 資料?同樣,對於 Java 技術來說這隻是小事一樁。資料接收通過一個通訊端對象完成。清單 5 展示的代碼將接收傳入的資料並將資料推入到 ArrayList 類的對象中。

    客戶機現在必須解決兩個與所接收資料項目的數量有關的問題。由於這是一個鬆散耦合的情境,您必須假定客戶機並不清楚服務組態檔(即 清單 1 中的代碼)中包含了多少 XML 資料項目。因此,您必須確定一些方法來接收和處理精確的資料項目數量。第二個問題比較容易解決,就是如何儲存處理過的資料。您將看到,清單 5 同時解決了這兩個問題。

    清單 5. 提取嵌入的 XML 資料

    XMLDecoder d = new XMLDecoder(input);

    try

    {

    while (true)

    ArrayList< Object[]> rowList = new ArrayList< Object[]>();

    {

    String dataItem = (String)d.readObject();

    System.out.println("XML decoded data: " + dataItem);

    rowList.add(dataItem);

    }

    }

    }

    catch (Exception exc)

    {

    if (exc instanceof ArrayIndexOutOfBoundsException)

    {

    // No more records to process

    System.out.println("Parsed all XML records - " +

    "threw exception. Number of rows: " + rowList.size());

    }

    }

    d.close();

    通過一個有限迴圈 while (true),您可以確定期望的到來資料項目的數量。該代碼將一直執行迴圈,直到接收到最後一個資料項目,此時將拋出一個異常(ArrayIndexOutOfBoundsException)。您必須使用這種異常機制,除非客戶機已經瞭解期望的資料項目數量。

    從InputStream 對象接收的 XML 資料被儲存在 ArrayList 類的一個對象中。該類對於此類應用程式非常有用。完成類定義之後,ArrayList 具有一個特定的容量,總是匹配底層列表的大小。在添加元素時,ArrayList 對象的容量將自動擴充。因此,您無需擔心會超過數組的極限,因為該類將為您處理這一問題。

    此時,客戶機具有 清單 1 中資料的副本。客戶機現在可以將頻寬元素修改為所需的值,然後反向執行檔案傳輸過程,從客戶機發送到伺服器。通過將 XML 檔案從伺服器移動到客戶機,客戶機實際上使用了這一服務。更新後的資料被發送回伺服器以完成事務。當然,服務提供者必須驗證傳入的資料並提供所需的頻寬更改。

    本文描述的這種模式首先將一個 XML 檔案通過網路傳輸到客戶機。客戶機將檔案資料作為流進行接收,然後將其解析為一個記憶體駐留對象。客戶機隨後對記憶體駐留對象變更,然後反向執行傳輸過程,將對象發回到伺服器。

    還存在一種服務,其中 XML 資料被完整無缺地從伺服器傳輸到客戶機。這種情境中,客戶機使用某種形式的檔案傳輸通訊協定(例如 FTP)獲得完整的檔案副本。由於檔案傳輸是一種標準技術,這裡不作過多介紹,您只需瞭解客戶機將下載 清單 1 中服務配置資料的一個檔案副本。此時,客戶機需要解析並修改檔案,然後傳輸回伺服器,這種模式的工作原理是什麼?

    一種基於 XML 檔案的 Java 機制

    客戶機現在將服務組態檔的副本儲存在磁碟中。必須對該檔案進行解析以提取 XML 資料。讓人意外的是,這實現起來有些難度,對於較大的檔案尤其如此。解決問題的關鍵是使用合適的解析工具。本文中使用的工具是 dom4j,該工具允許您將 XML 資料解析為一個 Java 對象。您還可以使用一個基於 Simple API for XML (SAX) 的解析器,但是 SAX 是一種較低級的技術。您將看到,dom4j 工具僅需要很少的工作即可完成解析。清單 6 引用自本文附帶的ProcessEventXml.java 檔案,展示了使用 dom4j 解析檔案所需的主要元素。

    清單 6. dom4j 處理 XML 資料

    try

    {

    handler.treeWalk(handler.parse(new File(argv[0])));

    }

    catch (Throwable t)

    {

    t.printStackTrace();

    }

    }

    public Document parse(File url)

 

 

    throws DocumentException

    {

    SAXReader reader = new SAXReader();

    Document document = reader.read(url);

    return document;

    }

    public void treeWalk(Document document)

    throws Exception

    {

    treeWalk(document.getRootElement());

    }

    基本上只需要兩種方法:parse() 和 treeWalk()。當我運行經過編譯的類時,我獲得了如 清單 7 所示的輸出。如果您希望親自運行代碼,請確保下載、安裝 dom4j 副本,並添加到 CLASSPATH 中(最後一步就是將相應的 JAR 檔案添加到您的 CLASSPATH 變數中)。然後,編譯 ProcessEventXml.java 檔案並使用以下命令運行程式:

    java ProcessEventXml ServiceDefinition.xml

    清單 7. 使用 dom4j 處理 XML 檔案

    java ProcessEventXml ServiceDefinition.xml

    Josephine Bloggs Internet 1mbps 1Gbyte 95

    正如您看到的,僅需少量工作即可整潔地顯示 XML 資料。這些工作都是由 dom4j 處理的。事實上,大部分工作是通過 treeWalk() 方法完成的,這是一種只有到達檔案末尾才進行調用的遞迴式方法。這裡向您展示了 dom4j 的一個功能:在記憶體中進行處理。需要注意的是,該技術不適合用於特別大型的 XML 檔案,特別是如果您的 Java 裝置非常小的話。然而,在本文的例子中,XML 資料集非常小,因此使用這個功能不會產生問題。

    您的基於檔案的客戶機現在已經成功訪問了 XML 資料。客戶機可以根據需要修改資料並編寫新的 XML 檔案。然後將其傳輸回伺服器進行處理。像上文一樣,客戶機在這一過程中使用了該服務。

 

 

    throws DocumentException

    {

    SAXReader reader = new SAXReader();

    Document document = reader.read(url);

    return document;

    }

    public void treeWalk(Document document)

    throws Exception

    {

    treeWalk(document.getRootElement());

    }

    基本上只需要兩種方法:parse() 和 treeWalk()。當我運行經過編譯的類時,我獲得了如 清單 7 所示的輸出。如果您希望親自運行代碼,請確保下載、安裝 dom4j 副本,並添加到 CLASSPATH 中(最後一步就是將相應的 JAR 檔案添加到您的 CLASSPATH 變數中)。然後,編譯 ProcessEventXml.java 檔案並使用以下命令運行程式:

    java ProcessEventXml ServiceDefinition.xml

    清單 7. 使用 dom4j 處理 XML 檔案

    java ProcessEventXml ServiceDefinition.xml

    Josephine Bloggs Internet 1mbps 1Gbyte 95

    正如您看到的,僅需少量工作即可整潔地顯示 XML 資料。這些工作都是由 dom4j 處理的。事實上,大部分工作是通過 treeWalk() 方法完成的,這是一種只有到達檔案末尾才進行調用的遞迴式方法。這裡向您展示了 dom4j 的一個功能:在記憶體中進行處理。需要注意的是,該技術不適合用於特別大型的 XML 檔案,特別是如果您的 Java 裝置非常小的話。然而,在本文的例子中,XML 資料集非常小,因此使用這個功能不會產生問題。

    您的基於檔案的客戶機現在已經成功訪問了 XML 資料。客戶機可以根據需要修改資料並編寫新的 XML 檔案。然後將其傳輸回伺服器進行處理。像上文一樣,客戶機在這一過程中使用了該服務。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.