簡述JAXM構(gòu)建Web服務(wù)及應(yīng)用
出處:陳智罡 發(fā)布于:2011-08-31 14:34:21
JAXM(Java API for XML Messaging簡稱JAXM)是為Java平臺上的應(yīng)用程序定義的API,用以通過XML(以及SOAP)發(fā)送和接收消息,支持同步消息和異步消息。JAXR API是在JCP下開發(fā)的,代號JSR 67。 JAXM的基本概念包括消息,連接,消息提供者以及JAXM客戶端和JAXM服務(wù)消息,JAXM的消息使用SOAP消息標準,包括或不包括附件。
1 JAXM相關(guān)概念
完整的JAXM API存在于javax.xml.soap和javax.xml.messaging二個包中。javax.xml.soap是用于接發(fā)SOAP消息的基本包,主要包含了發(fā)送帶有附件的SOAP消息的API(SOAP with Attachments API for Java,SAAJ)。這個包包含所有發(fā)送請求-響應(yīng)消息所必需的API。javax.xml.messaging包含了使用消息接發(fā)提供者必須的API,因此能夠發(fā)送單向消息。JAXM有兩種連接:直接連接,由消息發(fā)送者直接發(fā)送給消息的接收者的連接。間接連接,消息發(fā)送者通過消息提供者發(fā)送給消息接收者的連接。消息提供者(Messaging Provider)消息提供者是中介服務(wù),負責(zé)為消息發(fā)送者處理消息的傳送和路由。消息提供者也會提供一些服務(wù),如可靠消息。
JAXM消息遵循SOAP標準,規(guī)定了消息的格式。通過JAXM API可以方便地創(chuàng)建遵從SOAP規(guī)范的XML消息。簡單對象訪問協(xié)議,簡單對象訪問協(xié)議(SOAP)是一種輕量的、簡單的、基于 XML 的協(xié)議,它被設(shè)計成在 WEB 上交換結(jié)構(gòu)化的和固化的信息。 SOAP 可以和現(xiàn)存的許多因特網(wǎng)協(xié)議和格式結(jié)合使用,包括超文本傳輸協(xié)議( HTTP),簡單郵件傳輸協(xié)議(SMTP),多用途網(wǎng)際郵件擴充協(xié)議。它還支持從消息系統(tǒng)到遠程過程調(diào)用(RPC)等大量的應(yīng)用程序。SOAP采用了已經(jīng)廣泛使用的兩個協(xié)議:HTTP 和XML。HTTP用于實現(xiàn) SOAP 的RPC 風(fēng)格的傳輸, 而XML 是它的編碼模式。采用幾行代碼和一個XML 解析器,HTTP服務(wù)器( MS 的 IIS 或 Apache) 立刻成為SOAP 的 ORBS。SOAP 通訊協(xié)議使用 HTTP 來發(fā)送XML 格式的信息。HTTP與RPC 的協(xié)議很相似,它簡單、配置廣泛,并且對防火墻比其它協(xié)議更容易發(fā)揮作用。HTTP 請求一般由 Web 服務(wù)器軟件(如 IIS 和Apache)來處理, 但越來越多的應(yīng)用服務(wù)器產(chǎn)品正在支持HTTP。XML作為一個更好的網(wǎng)絡(luò)數(shù)據(jù)表達方式( NDR)。SOAP把XML的使用代碼化為請求和響應(yīng)參數(shù)編碼模式。并用HTTP 作傳輸。具體地講,一個SOAP 方法可以簡單地看作遵循SOAP編碼規(guī)則的HTTP請求和響應(yīng),一個SOAP終端則可以看作一個基于HTTP 的URL,它用來識別方法調(diào)用的目標。像CORBA/ IIOP一樣,SOAP不需要具體的對象綁定到一個給定的終端,而是由具體實現(xiàn)程序來決定怎樣把對象終端標識符映像到服務(wù)器端的對象。
2 使用JAXM建立Web服務(wù)消息接發(fā)
JAXM客戶端可以使用消息接發(fā)提供者,也可以不用。沒有使用消息接發(fā)提供者的應(yīng)用程序被限制只能承擔(dān)客戶端的角色,只能發(fā)送請求-響應(yīng)消息。下面介紹建立不使用消息接發(fā)提供者的Web服務(wù)消息接發(fā),即點對點的請求-響應(yīng)消息接發(fā)。
?。?)獲得連接。任何一個JAXM客戶端需要完成的件事是獲得連接。當前客戶端使用SOAPConnection對象創(chuàng)建連接,使用SoapConnection對象發(fā)送的消息直接從發(fā)送者到發(fā)送者指定的URL,示例如下:
SOAPConnectionFactory scf=SOAPConnectionFactory.
newInstance( );
SOAPConnection con=scf.createConnection( );
(2)創(chuàng)建消息。生成消息可以使用SAAJ API提供的MessageFactory類的默認實現(xiàn)。
MessageFactory mf=MessageFactory.newInstance( );
SOAPMessage msg=mf.createMessage( );
由messageFactory創(chuàng)建的所有SOAPMessage對象都是基本SOAP消息,這意味著它們沒有預(yù)定義的頭部。JAXM所具有的靈活性之一就是它允許SOAP頭部有特殊的用途。
?。?)向消息添加內(nèi)容。可以向SOAPPart對象以及一個或多個AttachmentPart對象添加內(nèi)容,也可以向消息的這二個部分都添加內(nèi)容。為了向消息體添加內(nèi)容,需創(chuàng)建一個SOAPBodyElement對象并添加一個使用SOAPElement.addTextNode方法建立的XML元素。
?。?)發(fā)送消息。一旦填充了一個SOAPMessage對象,就可以發(fā)送此對象了。單獨客戶端使用SOAPConnection的call方法來發(fā)送消息。該方法發(fā)送完消息之后就將自己阻塞起來,直到收到響應(yīng)為止。
(5)從響應(yīng)消息中檢索內(nèi)容??蛻舳耸褂胦nMessage方法檢索消息內(nèi)容??蛻舳送ㄟ^消息得到envelope,再通過envelope得到body,從而訪問SOAPBody對象。
3 使用JAXM構(gòu)建Web服務(wù)應(yīng)用
下面使用JAXM 構(gòu)建對外提供話費查詢的Web服務(wù)。由于客戶端是Web服務(wù)的消費者,所以JAXM客戶端不需要消息接發(fā)提供者,使用點對點的請求-響應(yīng)消息接發(fā)即可。話費查詢服務(wù)系統(tǒng)體系結(jié)構(gòu)如圖1所示。
客戶端可以是一般的Java GUI程序(當然也可以是JSP、Servlet等),客戶端通過SOAP消息與Servlet容器中運行的JAXM Servlet進行交互。JAXM Servlet是服務(wù)提供者,EJB容器里運行的是業(yè)務(wù)組件,為JAXM Servlet提供服務(wù)。

系統(tǒng)為客戶端提供了三種查詢服務(wù):每月匯總查詢、話費詳單查詢、即時詳單查詢。這三種服務(wù)分別對應(yīng)服務(wù)端的三個JAXM Servlet實現(xiàn):TotalMonth,每月匯總查詢;DetailMonth,話費詳單查詢。
?。?)數(shù)據(jù)模型。在數(shù)據(jù)庫中保存每個用戶的話費信息。為了便于傳輸數(shù)據(jù),減少遠程調(diào)用的次數(shù),特別設(shè)計了值對象TelExpVA來代表話費信息。值對象設(shè)計模式在J2EE模式中大量使用。JAXM Servlet和EJB組件之間傳遞數(shù)據(jù)就是通過對象來傳遞的。這個對象是包含有TelExpVA實例的java.util.Collection。但是JAXM和客戶端是通過SOAP消息來傳遞的(也可以使用序列化的對象作為附件發(fā)送)……
?。?)業(yè)務(wù)邏輯。業(yè)務(wù)層是EJB組件,使用了二個EJB組件,一個是TelExpServiceFacadeEJB,它是一個有狀態(tài)會話Bean;另一個是TelExpEntityEJB,它是一個實體Bean,代表了持久數(shù)據(jù)。TelExpServiceFacadeEJB是會話門面,JAXM Servlet通過它來和TelExpEntityEJB交互。
?。?)JAXM服務(wù)端。JAXM服務(wù)端Servlet處理消息的步驟是:獲得消息(onMessage),讀取消息中需要的參數(shù),利用參數(shù)調(diào)用對應(yīng)的業(yè)務(wù)處理,構(gòu)建響應(yīng)SOAP消息,返回處理后的消息。
在JAXM 服務(wù)端設(shè)計了三個服務(wù)JAXM Servlet,分別對應(yīng)三個查詢用例,其關(guān)系如圖2所示。

由于使用了點對點的消息模型,服務(wù)端需要實現(xiàn)javax.xml.messaging.ReqRespListener接口,并且需要繼承javax.xml.messaging.JAXMServlet類。onMessage方法就是當Servlet接收到SOAPMessage時激發(fā)的方法,通過此方法對外界提供服務(wù)。
?。?)客戶端。終客戶端是一個叫TelExpClientGUI的圖形界面程序,它并不直接與SOAP消息打交道,而是通過JAXMDelegate類與服務(wù)端JAXM Servlet進行交互。另外,還設(shè)計了一個BookBusiness接口。JAXMDelegate實現(xiàn)了BookBusiness接口,BookClientGUI持有BookBusiness的實例,它通過這個實例獲得信息。
?。?)使用XML業(yè)務(wù)代表的模式。用JAXM進行Web服務(wù)開發(fā)還不普遍,相應(yīng)的設(shè)計模式的探討還較少,它的設(shè)計模式和J2EE平臺其他組件的設(shè)計模式基本一致。但它有自己的特點,如客戶端和服務(wù)端是通過SOAP消息進行通信,這與J2EE平臺的其他組件之間的通信不同。在JAXM編程中,為了實現(xiàn)數(shù)據(jù)(這里是SOAP消息)的一致返回,可以使用XML業(yè)務(wù)代表的模式。用JAXM進行編程時,數(shù)據(jù)傳遞的特點如圖3所示。

客戶端終要使用的數(shù)據(jù)是Java對象或者Java的基本數(shù)據(jù)類型,而客戶端和服務(wù)端的通信是通過SOAP消息格式來傳輸,而在服務(wù)端要調(diào)用業(yè)務(wù)邏輯,必須使用Java對象或者是Java基本數(shù)據(jù)類型,這使數(shù)據(jù)的傳輸和數(shù)據(jù)的使用出現(xiàn)矛盾。為解決矛盾,可以使用數(shù)據(jù)轉(zhuǎn)換器來轉(zhuǎn)換數(shù)據(jù),以降低層之間的耦合度,使數(shù)據(jù)易于處理。當客戶端要發(fā)送數(shù)據(jù)時,使用數(shù)據(jù)轉(zhuǎn)換器把請求數(shù)據(jù)轉(zhuǎn)換為SOAP消息格式。
在客戶端,通過使用JAXM業(yè)務(wù)代表,可以降低終客戶和SOAP消息的耦合度。系統(tǒng)的結(jié)構(gòu)如圖4所示。

當客戶端發(fā)出請求時,它調(diào)用JAXMDelegate對應(yīng)的方法;JAXMDelegate根據(jù)請求構(gòu)造對應(yīng)的SOAP消息,然后把消息發(fā)送到服務(wù)端;服務(wù)端根據(jù)客戶的請求做出對應(yīng)的處理,并把處理結(jié)果返回到JAXMDelegate;JAXMDelegate使用數(shù)據(jù)轉(zhuǎn)換器把返回的SOAP Message轉(zhuǎn)化成Java對象(如值Bean),返回給客戶端;客戶端再把獲得的數(shù)據(jù)進行處理后顯示。
服務(wù)端的模式和客戶端的模式基本一樣,只是處理過程相反。服務(wù)端從客戶端接收到SOAP消息后,讀取參數(shù),調(diào)用對應(yīng)的業(yè)務(wù)方法,然后使用數(shù)據(jù)轉(zhuǎn)換器把調(diào)用的結(jié)果轉(zhuǎn)換成SOAP消息返回。
4 結(jié)束語
JAXM作為輕量級的API,抽象了底層的消息基礎(chǔ)結(jié)構(gòu)。因此,開發(fā)時利用SOAP包裝的JAXM消息是容易的。需要強調(diào)的是,如果使用點對點的消息發(fā)送模型,則服務(wù)端Servlet必須實現(xiàn)ReqRespListener接口,onMessage( )方法將是開發(fā)服務(wù)端Servlet的重點任務(wù)。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 工業(yè)5G技術(shù)在智能制造中的應(yīng)用與實踐解析2025/12/31 10:57:21
- 工業(yè)以太網(wǎng)交換機選型與現(xiàn)場應(yīng)用技術(shù)指南2025/12/18 10:48:14
- 無線傳輸電路基礎(chǔ),射頻前端設(shè)計、天線匹配與鏈路預(yù)算計算2025/10/27 13:55:50
- ASK 解調(diào)的核心要點與實現(xiàn)方式2025/9/5 16:46:17
- 雙偶極子天線:結(jié)構(gòu)、特性與應(yīng)用全解析2025/9/3 10:29:21
- 高速PCB信號完整性(SI)設(shè)計核心實操規(guī)范
- 鎖相環(huán)(PLL)中的環(huán)路濾波器:參數(shù)計算與穩(wěn)定性分析
- MOSFET反向恢復(fù)特性對系統(tǒng)的影響
- 電源IC在惡劣環(huán)境中的防護設(shè)計
- 連接器耐腐蝕性能測試方法
- PCB電磁兼容(EMC)設(shè)計與干擾抑制核心實操規(guī)范
- 用于相位噪聲測量的低通濾波器設(shè)計與本振凈化技術(shù)
- MOSFET在高頻開關(guān)中的EMI問題
- 電源IC在便攜式設(shè)備中的設(shè)計要點
- 連接器結(jié)構(gòu)設(shè)計常見問題分析









