JavaCompute 節點
新的 JavaCompute 節點顯著地改進了 Java™ 在 IBM® WebSphere® Message Broker V6 中的使用,它允許為消息流應用程序直接編寫 Java 源代碼。其替代方法是在 ESQL 中編寫相關的邏輯,并從 ESQL 中調用 Java 過程,或編寫自定義的處理節點。這兩種方法仍然是有效的選擇,但是 JavaCompute 節點是在 WebSphere Message Broker V6 中使用 Java 的推薦方式。其巨大的優勢在于,為 JavaCompute 節點開發的代碼可以部署到代理運行時中,而代理運行時使用相同機制來部署消息流、消息集和 ESQL 邏輯。這個功能為您提供了與使用 ESQL 開發消息流類似的體驗。
JavaCompute 節點還通過基于 XPath 1.0 語法的消息處理擴展了現有的 Java API。在工具包中為這些節點開發 Java 代碼,可以充分利用 Java 開發環境,該開發環境內置在 Rational Application Developer 中,并且提供了內容輔助、重構工具和其他一些有價值的特性。另外,還包括了 JavaCompute 節點向導,該向導使用模板類來初始化 Java 項目,并引用所需的依賴項。JavaCompute 節點支持使用外部類,允許重用消息流中使用 Java 編寫的現有業務邏輯。
具有 Java 技能的開發人員可以使用全面支持開發過程的環境和部署模型中的工具包,從而使用 JavaCompute 節點以純 Java 代碼的方式編寫流邏輯。
JavaCompute 節點的功能
JavaCompute 節點可用于:
以下幾部分將重點關注這些功能的技術層面:JavaCompute 節點的創建、開發和部署。
為 JavaCompute 節點創建節點
JavaCompute 節點需要一個在 Java 項目中實現的擴展 com.ibm.broker.javacompute.MbJavaComputeNode
類的 Java 類。對 MbJavaComputeNode
類所進行的擴展必須實現 evaluate
方法,該方法提供了用于對該節點接收到的消息進行處理的邏輯。Java 項目還必須包含對實現 Message Broker 的 JavaCompute 節點 API 的 jar 文件(javacompute.jar
和 jplugin2.jar
)的引用。除了使用模板類來初始化 Java 項目和引用其所需的依賴項之外,JavaCompute 節點向導還可以執行大部分的設置工作,并向您提示相應的名稱和對模板的選擇。在為消息流添加了 JavaCompute 節點之后,您必須完成下面的步驟,以調用并執行相應的配置:
下面顯示的是在選擇了第一個篩選模板時的代碼:
然后,您可以使用 Eclipse 中的內容輔助功能來開發這個類。
關聯現有的代碼
在開發了 JavaCompute 節點類之后,可以將其重用于后續節點。要完成這項任務,只需將新的 JavaCompute 節點拖放到消息流上,然后從該節點的屬性中選擇現有的類類型。
消息處理
JavaCompute 節點可以提供具有路由和轉換邏輯的消息流。對可用的路由和轉換功能摘要描述如下。
在流中進行路由
在消息流中對消息進行路由的能力提供了流決策點,從而可以為任何給定的消息選擇替代的處理和目標。在流中對消息進行路由有兩種可用的方法,即通過節點終端或路由到標簽 (route-to-label) 方法。
使用 Out 和 Alternate 終端進行路由
通過兩種輸出終端,JavaCompute 節點包含了雙向路由功能,它們在工具包中分別標識為“Out”和“Alternate”終端。下面的代碼片段獲得了這些終端,以便能夠在該方法中對其進行傳播。在 Java 代碼中引用這些終端時,首字母需要小寫:
|
然后使用下面的代碼將所接收的消息傳播到 Out 終端:out.propagate(assembly);
同樣,要篩選一些將傳播到 alternate 終端的消息,可以在 alt 對象中調用 propagate 方法。要立即釋放節點中創建的任何 MbMessage 對象所使用的內存,始終可以在從計算返回之前,對它們調用 clearMessage 方法。
要創建一個篩選類型的節點,可以在 JavaCompute 節點創建向導中選擇 Filtering Message Class 模板。
RegexFilterNode 和 RoutingFileNode 示例演示了這個功能。本文中引用的所有示例都來自于 WebSphere Message Broker V6。
RouteToLabel
如果僅路由到兩個終端還不夠的話,那么在產品的其他部分中,您可以使用 RouteToLabel 方法。這個流展示了一個示例,其中 JavaCompute 節點確定 RouteToLabel 節點將消息傳播到哪一個標簽節點:
對消息進行轉換
對消息進行轉換包括導航輸入消息并創建經過修改的或新的輸出消息。
導航輸入消息
導航任何節點接收的消息需要基于消息的路由和轉換。下面的消息將在后面的代碼段中使用,它展示了用于導航消息的技巧。下面的 XML 文檔以經過解析的消息樹的格式呈現:
|
Key 中包含了用于導航消息樹的 MbElement 類的可用 Java 方法的細節。
也可以使用一些采用 XPath 1.0 語法的方法,但是在此圖中沒有對其進行說明。
MbElement 導航
這段 Java 代碼對文檔進行訪問,然后訪問邏輯樹中的第一個 chapter 元素:
|
JavaComputeTransformNoXPath 示例演示了這個功能。
XPath 1.0 導航
您還可以使用 XPath 語法來檢索消息的內容。下面的 Java 代碼使用 XPath 語法訪問邏輯樹中的第一個 chapter 元素:
|
WebSphere Message Broker V6 中附帶的 JavaComputeTransformXPath 示例演示了這個功能。
創建輸出消息
同樣,您可以使用 API 和 XPath 語法模型來創建輸出消息。
MbElement 的創建
通過與訪問消息樹元素類似的方式,對于特定的 MbElement,您還可以訪問 create 方法并使用它們來創建孩子和兄弟元素。下面的代碼創建了 title 元素作為 chapter 元素的第一個孩子:
|
WebSphere Message Broker V6 中附帶的 JavaComputeTransformNoXPath 示例演示了這個功能。
XPath 的創建
XPath 支持包括以類似 XPath 的語法創建元素的 XPath 擴展。例如,"/?title[set-value(‘Introduction’)]"
將創建一個 title 元素并設置它的值。
下面的代碼添加 title 元素并設置它的值(對于給定的包含 document 和 chapter 元素的消息):
|
WebSphere Message Broker V6 中附帶的 JavaComputeTransformXPath 示例演示了這個功能。
配置節點
有許多機制可以用于配置 JavaCompute 節點:
下面幾部分將詳細描述這些技巧。
用戶定義屬性
用戶定義屬性是 V6 中為消息流節點提供流級別配置的新機制。在 JavaCompute 節點中,將其稱為用戶定義屬性,在為 getUserDefinedAttributes
方法提供了屬性名稱后,它將返回該屬性在流中所設置的值。這些設置是針對流級別的,而不是針對單獨的節點的,所以可以通過流中所有的 JavaCompute 和 Compute 節點來訪問相同的屬性。
對于前面的流,您可以使用下面的 Java 調用來訪問屬性:
|
WebSphere Message Broker V6 中附帶的 RegexFilterNode 示例演示了這個功能,并且在本部分中使用這個示例進行了說明。
消息
消息在通過節點時可以用來進行動態配置。您可以訪問 Environment
、LocalEnvironment
以及消息正文,從而為這種配置的設置提供各種各樣的方法。然后,您可以將這些設置保存在類的靜態成員中,以便后續的消息可以使用其值。在每次啟動執行組或部署消息流時,靜態變量將恢復為其缺省值。
代理屬性
Java API 提供了大量的代理屬性,用于檢索代理、執行組和具有運行的節點的消息流的細節信息。下面的代碼用于檢索這些資源的名稱,還可以使用這里沒有列舉的其他值。
|
同樣,您可以使用這些代理屬性來提供與環境相關的配置。
文件
Java Compute 節點可以使用標準的 java.io 類(也可用于配置該節點)來訪問運行時系統。另外,Java 代碼可以對部署于 jar 中的文件以及 Java 類文件進行訪問。Routing File Node 示例演示了這個功能。
調用 Java 依賴項
為 JavaCompute 節點開發的 Java 類可以調用現有的 Java 類。為了使 Message Broker 運行時引用 jar 文件,必須將其放置在下列位置其中之一:部署于代理存檔文件;復制到 <Work Path>/shared-classes;
,或出現在 Message Broker 的 CLASSPATH 中。GoogleAPINode 和 NewsGroupGetNode 示例演示了這個功能。
數據庫支持
有兩種方法可以提供數據庫訪問:
部署包含 JavaCompute 節點的流
部署工作是將數據傳輸到代理中的執行組的過程,所以它可以在代理域中生效。為了部署消息流和關聯的 JavaCompute 類,可以將這些資源打包到一個代理存檔 (bar) 文件中,這是常規部署過程中的一部分。不需要任何 JavaCompute 節點特定的附加步驟。向 bar 文件中添加包含 JavaCompute 節點的流,也會觸發將這些 Java 類打包到 Java 存檔 (jar) 文件的操作,然后將 Java 存檔文件包含到 bar 文件中,隨后可以將該 bar 文件部署到代理中。
當將 jar 文件部署到代理中時,它和消息流一同出現在工具包的 Domains 視圖中,如右邊所示。V6 還為 jar 文件提供了版本控制和關鍵字支持,并且這項支持可以使用 jar 文件內嵌入的文件 (META-INF/keywords.txt) 中的設置。
調試
要在 Message Broker Toolkit 中對節點進行調試,首先需要為運行 Message Broker 的 JVM 設置一個調試端口??梢允褂孟旅娴拿钫Z法,它需要代理名稱、執行組和端口號:
|
重新啟動執行組以使該設置生效。當在工具包中設置 Message Broker 調試會話時,需要輸入 Java 調試端口。要僅重新啟動執行組,可以使用下面的命令:
|
JavaCompute 節點示例
WebSphere Message Broker V6 附帶了一個由五個消息流和對應的 JavaCompute 節點類組成的示例,該示例演示了這個節點的功能:
SampleUtils.java 中還包括用于添加最小限度的 MQMD 或 RFH2 Header 的示例實用方法。
JavaCompute 節點的性能
Java 支持建立在優于 ESQL 的高效實現的基礎之上。下面的表格詳細描述了在使用 XPath 語法方法的 Compute 節點內,在 JavaCompute 節點和 ESQL 中實現等價功能時的消息吞吐量。這個示例很簡單,它說明了從 Java 的觀點來看的最差情況的比較,因為在消息流中幾乎沒有對業務邏輯進行編碼。在實際情況下,可能具有更大比例的業務邏輯,因此運行 Java 的優勢將更加明顯。
任務 | ESQL 消息數/秒 | JavaCompute消息數/秒 | JavaCompute 占 ESQL 的百分比 |
---|---|---|---|
對輸入消息進行計算 | 886 | 793 | 90% |
對輸入消息進行操作 | 866 | 720 | 80% |
對第一個元素進行篩選 | 2443 | 2221 | 90% |
記錄這些數值的實驗環境為 IBM xSeries 360 服務器、4 x 2GHz Intel Xeon 處理器、3.5 GB RAM、Microsoft Windows 2000 (SP4),并且使用非持久性的 1K 字節的 XML 消息。
正如您所看到的,Java 實現要優于 ESQL 實現,這是因為在許多消息代理場景中,大部分的處理工作是解析和訪問消息中的元素。無論使用何種語言來編寫邏輯,都通過相同的基礎 XML 解析器完成這項處理工作。有關性能改進和獲得這些數值時使用的測試用例的更詳細的信息,請參閱 performance reports for WebSphere Message Broker V6。
z/OS 用戶可以通過使用具有 IBM System z 應用輔助處理器 (zAAP) 的 JavaCompute 節點來降低成本??梢詫⒃?JavaCompute 節點類中完成的任何工作卸載到 zAAP 處理器中。然而,與 WebSphere Message Broker 消息解析器相關的處理工作和序列化不適合于在 zAAP 上運行。
WebSphere Message Broker 中的附加 Java 支持
用戶定義擴展
用戶定義擴展是在 Message Broker 中編寫作為節點運行的代碼的另一種方法。使用這種方法開發的節點,可以指定終端的數目和名稱、該節點的屬性,以及該節點是否作為流的輸入節點。然而,用戶定義擴展的類必須安裝在運行時中。它們無法從 JavaCompute 節點的類部署機制中獲益。
Par 文件(V6 中新的文件)允許將用戶定義擴展的類和依賴項打包到一起并作為一個整體安裝到 Message Broker 中。
配置管理程序 API
配置管理程序 API 是配置管理程序的 Java 接口,它允許您以編程的方式控制代理域。它是 Message Broker Toolkit 所使用的接口,所以在 Java 應用程序中,可以創建和部署執行組,或者終止和啟動消息流。為了提供這種支持,該 API 使得 WebSphere MQ 客戶端連接到運行配置管理程序的隊列管理器。安裝中包含的“Configuration Manager Proxy API Exerciser”示例演示了該 API 的所有功能。下面的應用程序屏幕截圖在它的左邊顯示了這個域中的資源,從配置管理程序直到消息流。窗口的右邊提供了所選擇的消息流的詳細信息。
結束語
本文描述了 WebSphere Message Broker V6 中的擴展 Java 支持,重點關注新的 JavaCompute 節點的功能。本文介紹了如何為這種節點創建 Java 代碼,以及如何輕松地將其部署到 Message Broker。通過將路由和轉換功能與優良的性能相結合,使得完全使用 Java 語言編寫其邏輯的消息流成為那些具有 Java 技能的開發人員的實際選擇。如果 Java 業務邏輯已經存在,您可以在這些節點之一中進行重用。本文還描述了 WebSphere Message Broker 新的發布版中的一些附加增強 Java 支持。有關 WebSphere Message Broker V6 中的 Java 支持及其相關技術的詳細信息,請參見下面的“參考資料”部分。
原文轉自:http://www.anti-gravitydesign.com