程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 擴展Axis2框架,支持基於JVM的腳本語言

擴展Axis2框架,支持基於JVM的腳本語言

編輯:關於JAVA

本文介紹了如何擴展Axis2框架,以支持Jython、JRuby等基於Java虛擬機(JVM)的腳本語言。文章對這一主題進行了高層次概述,包括 Apache Axis2的一些關鍵概念,以及如何利用Axis2為基於JVM的腳本語言提供擴展。讀完此文,開發人員可以擴展Axis2框架,來支持基於JVM的腳本語言。Axis2框架擴展之後,可以輕松做到如下兩點:

將腳本開發為Web服務。

用所選的腳本語言編寫服務客戶端。

Apache Axis2是開源的Web服務引擎。它對應用廣泛的Apache Axis SOAP堆棧進行了徹底的重新設計和編寫。Axis2不僅能為Web應用添加Web服務接口,還能作為獨立的服務器應用運轉。Apache Axis2支持SOAP協議,也支持備受歡迎的REST風格Web服務。使用Axis2,你可以將業務邏輯實現暴露為WS-*風格的接口,與此同時,也可以將該實現暴露為REST/POX風格的接口。

設計JVM的初衷僅僅是為了支持Java編程語言。但隨著時間的流逝,越來越多的語言移植到了Java平台,其中包括很多腳本語言。JVM現在支持諸多腳本語言,比如Jython、JRuby、ColdFusion等。簡單起見,本文選擇了Jython,不過描述的技術同樣適用於其他語言。

Jython是Python編程語言的Java實現。它取Java、Python兩者之所長,是這兩種語言的混合編程。由於Jython是完全用 Java編寫的,所以用Jython編寫的腳本能運行在任何兼容的JVM上,並能使用現有的Java庫(這些Java庫得是Python模塊)。

Web服務的實現方法

Web服務是構建面向服務的體系架構(SOA)的一組技術。盡管SOA和Web服務之間的關系通常很容易混淆,但Web服務是一種實現技術,它采用標准協議來執行SOA,理解這一點很重要。開發Web服務的技術中,使用較為廣泛的兩種是代碼優先和契約優先:

使用代碼優先的方法,主要關注點是給出代碼;你要先編寫Java代碼,再根據Java代碼生成Web服務契約(WSDL)。相比之下,契約優先強調的則是服務契約;你先編寫WSDL契約,然後使用Java或代碼生成工具實現該契約。契約優先的方法有一些好處,它能促進:

應用之間的松散耦合

多個服務之間的互操作性

抽象的使用,從而隱藏底層的實現細節

所有參與方之間的協作和一致的達成

代碼優先的方法則有如下優勢:

簡單、省時

能將遺留系統暴露為Web服務

不用深入了解WSDL的相關知識

這就是說,在設計服務契約時,你可以在代碼優先和契約優先兩種技術中擇其一。最終的決定則取決於你是更想確保互操作性,還是更想提高生產力。本文將展示如何擴展Apache Axis2,使其對兩種方式都進行支持。

擴展Axis2框架,以支持代碼優先

Axis2包含一個基於XML的客戶端API,功能甚為強大。這個API可用來開發Java服務客戶端。現在的需求是用腳本語言編寫服務客戶端,我們選擇Jython進行演示。

要讓Jython與Axis2客戶端庫協作,我們需要開發Axis2客戶端API的包裝庫。開發該包裝庫的目的是在現有功能主體之上創建一個抽象層。此時,我們要重新定義Axis2客戶端API的接口,使其能接受Jython腳本。

上圖顯示了API的架構。當執行Jython客戶端腳本時,會創建並執行一個相映射的Java服務客戶端。接著會進行Web服務調用,將結果返回給客戶端腳本。

通過客戶端API發送SOAP消息時,會激活輸出管道(Out Pipe)。輸出管道將調用各個處理器,最終由傳輸發送者(Transport Sender)把SOAP消息發送給目標端點。SOAP消息由傳輸接收者(Transport Receiver)接收,傳輸接收者會讀取SOAP消息、啟動輸入管道(In Pipe)。輸入管道由一些處理器組成,終端是Jython消息接收者(Message Receiver),Jython消息接收者會消費SOAP消息,並把它交給應用。

下面的代碼片段展示了調用Web服務的Jython客戶端。

from org.wso2.wsf.jython.client import WSClient
from org.wso2.wsf.jython.client import WSFault
from org.wso2.wsf.jython.client import WSMessage

req_payload_string = "<webSearch><appid>ApacheRestDemo</appid><query>Sri Lanka</query><form/></webSearch>"
LOG_FILE_NAME = "/home/heshan/IdeaProjects/MRclient/src/jython_yahoo.log"
END_POINT = "http://search.yahooapis.com/WebSearchService/V1/webSearch"

try
     client = WSClient({ "to" : END_POINT,
        "http_method" : "GET",
     "use_soap" : "false"},
   LOG_FILE_NAME)
  req_message = WSMessage(req_payload_string, {})
  print " Sending OM : " , req_payload_string
  res_message = client.request(req_message)
  print " Response Message: " , res_message

except WSFault, e:
  e.printStackTrace();

擴展Axis2框架,以支持契約優先

Axis2代碼生成器

提到代碼生成,Axis2含有一個代碼生成模塊——Axis2代碼生成器(Axis2 Code Generator)。代碼生成器能合並多個數據綁定框架,而且易於擴展。因此代碼生成工具可以進行擴展,以支持腳本語言。在深入擴展工具的細節之前,讓我們先看看Axis2的代碼生成器。

考量SOAP處理引擎時,一個關鍵的附加價值就是基於WSDL的代碼生成。代碼生成要能:

為用戶提供方便——代碼生成工具要幫助用戶以簡單、有效的方式使用框架。

充分利用框架。

現在來看看Axis2代碼生成器的架構。

工具的架構非常簡單。核心部分會處理WSDL文件、生成對象模型。然後根據模板解析生成的對象模型、生成源代碼。

擴展Axis2的代碼生成器,從而支持腳本語言

代碼生成引擎逐個調用擴展,最終會調用組件Emitter。Emitter是代碼生成流程中處理重要工作的真正組件。Emitter通常與語言相關,因此語言和Emitter是一一關聯的。所以我們要有一個支持Jython代碼生成的Emitter。上圖說明了這一簡單但功能強大的架構。

Emitter處理WSDL、生成對象模型。對象模型只不過是個XML文件,裡面包含針對WSDL、關於Axis2信息模型(即Axis服務、Axis操作、Axis消息等)的對象模型。模板是XSLT文件,含有如何生成代碼的信息。最後,生成的對象模型會根據模板進行解析、生成Jython源代碼。

要支持契約優先的方法,需要為服務生成一個框架、一個消息接收者。已經寫好的通用消息接收者運轉不了,它只能在有限的Schema結構上運行。我們可以利用Axis2現有的基礎設施來做到這一點。Axis2創建了一個表示WSDL的中間XML結構,我們必須根據該XML結構運行兩個XSLT文件,來生成框架類和消息接收者。有了這些XSLT文件和代碼生成工具,我們就能用Jython支持契約優先的Web服務了。最後,就可以使用消息接收者和框架來編寫Jython實現的服務客戶端了。

服務器端

本節將討論如何將業務邏輯暴露為Web服務。

要在Axis2中暴露Jython實現的Web服務,可以從Axis2可插拔部署器的概念中找找解決方案。為了暴露用Jython編寫的服務,我們要編寫一個自定義的部署器、一個Jython消息接收者。

消息接收者消費SOAP消息,並把SOAP消息傳給應用。消息接收者是輸入管道中最後一個處理器。

部署器需要將Jython的數據類型映射到XML Schema數據類型。這個過程稱為數據綁定。然後借助數據綁定和方法注解,就能為Jython服務生成XML Schema了。接下來,生成的XML Schema和有關AxisService的元數據都會交給Axis2引擎。Axis2引擎將創建出對應的WSDL,Jython服務也會被暴露為Web 服務。

上圖展示了該解決方案的架構。傳輸監聽器(Transport Listener)接收傳入的SOAP消息,並將消息傳給處理器鏈。接著,SOAP消息交由Jython消息接收者處理,消息接收者會遍歷Axis對象模型(AXIOM)的結構、檢索相關的信息。檢索到的信息再傳遞給Jython服務。然後Jython服務開始執行,生成的結果再返回給Jython消息接收者。Jython消息接收者會為返回的Jython對象創建一個AXIOM結構。接下來,響應經由處理器鏈發送給傳輸發送者。傳輸發送者再將響應發送給客戶端。對每個交換的SOAP消息來說,前面所述的過程都會執行一遍。

如何部署Jython服務

部署時,Axis2引擎會讀取Jython腳本的注解,並完成動態Jython類型到靜態Java類型的映射。這一過程稱為數據綁定。相應的匹配類型映射完成之後,會創建服務的XML Schema。下面的步驟描述了如何生成Jython服務的XML Schema:

讀取Jython服務的注解。

為Jython服務創建AxisService。

給每個Jython方法創建一個AxisOperation。

給操作增加AxisMessage。AxisMessage包含方法參數的類型。

將所有AxisOperation添加到AxisService中。

最終為Jython消息生成XML Schema。

生成的AxisService會交給Axis2引擎。最後由Axis2引擎生成WSDL。

結論

Apache Axis2可以以這種方式進行擴展,來支持基於JVM的腳本語言。擴展之後,用戶就可以暴露服務、用JVM腳本語言擴展編寫服務客戶端了。

關於作者

Heshan Suriyaarachchi是WSO2公司的一名軟件工程師,是WSO2企業服務總線(ESB)團隊的成員。Heshan具備Web服務、SOA、中間件和分布式系統的相關經驗。他喜歡打籃球,業余時間還參與開源項目。

他的博客是:http://heshans.blogspot.com/

查看英文原文:http://www.infoq.com/articles/axis2_scripting

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved