唐 青
福建衛生職業技術學院信息技術教研室,福建福州,350101
基于Tuscany SCA遠程訪問web service
唐 青
福建衛生職業技術學院信息技術教研室,福建福州,350101
以基金銷售系統中代銷機構交收資金明細查詢功能為例,討論了利用Tuscany SCA訪問遠程web service的實現過程。這個過程使用servlet與Tuscany SCA構件相結合技術,通過建立web構件、servlet程序及配置servlet過濾器,實現了基于SCA的遠程調用web服務。利用這種方法實現調用遠程服務,易于理解且實現相對簡單。
SCA web服務;遠程調用;servlet
當今,在分布式應用系統開發過程中,開發者常需要遠程訪問后臺系統或者第三方系統提供的web service。客戶端訪問web service方法有很多,常見的有利用JDK中web服務API調用web service,利用Apache CXF、Axis2等一些開源框架實現對web service遠程調用。上述方法雖然較為成熟,但實現時需要編寫的程序代碼較多,較為繁瑣。本文嘗試利用Apache Tuscany SCA實現web service的遠程調用。Apache Tuscany是一個開源SOA基礎架構,主要用于服務構件的開發、組裝、發布和管理;另外,它也提供了一種輕量級遠程服務調用方法。利用這種方法實現遠程服務的調用,相對簡單且易于理解。
為了更好地闡述這種調用遠程服務的方法,以基金銷售系統代銷機構交收資金明細查詢功能為例,詳細介紹利用Tuscany SCA進行遠程web service訪問的實現過程。如圖1所示,該功能在實現過程中需要通過web service方式訪問后臺清算子系統提供的Clearing Service,查詢獲得代銷機構交收資金明細數據。

圖1 采用web service方式訪問后臺清算子系統提供的Clearing Service
基于Tuscany SCA實現遠程服務調用的基本原理,使用servlet與Tuscany SCA服務構件結合技術。Tuscany SCA 允許將Java EE規范中web模塊(servlet)擴展為符合SCA規范要求的服務組件,這樣,web瀏覽器通過調用servlet就可以輕松地訪問遠程的web service。這種方式簡化了web服務器調用遠程服務的開發,同時使開發者將現有的servlet和SCA服務結合起來,大大提高了代碼的復用度。如圖2為基于SCA調用遠程服務的過程框架圖。
為了實現基于Tuscany SCA遠程訪問web service,除開發一個用于用戶交互的JSP網頁外,還需要完成以下主要任務:(1)基于Tuscany SCA,配置一個Web構件,利用該構件,引用遠程服務ClearingService;(2)建立實現查詢功能的servlet;(3)配置TuscanyServletFilter過濾器。
2.1 配置web構件
客戶端的jsp頁面在servlet程序順利調用遠程web Service之前,必須先配置一個如圖3所示的web構件。

圖2 基于SCA的遠程調用框架圖
Web構件包括Web Client和Clearing Reference Component兩個服務組件。其中,Web Client組件用于將servlet擴展為服務組件;Clearing Reference Component是標準的通過java類來實現的服務組件,用于引用遠程服務。

圖3 Web構件圖
Tuscany SCA下web構件的建立方法:通過在/META-INF/sca-deployables/目錄下新建web.composite文件。該文件定義了web構件的組成。web.composite文件架構內容如下:
……
……
……
根據構件圖和web.composite的架構內容,需要作如下說明[1]:
(1)在web構件中定義Web Client服務組件用來引用Clearing Reference服務。
(2)
(3)在web構件中定義了ClearingReference組件,該組件又定義了一個基于Web Service的引用Clearing Service。通過這個引用,便可以調用遠程的共享服務“ClearingService”,在架構代碼中為:
其中uri值表明了這個遠程服務的uri地址。
2.2 建立servlet程序
建立一個servlet程序,通過它可以查找和使用基于SCA的web服務。但是,不同的servlet容器對SCA的支持程度不一致,有些容器完全支持SCA,有些容器部分支持SCA。對于完全支持SCA的容器,servlet代碼就可以使用@Reference注釋;而對于不完全支持SCA的容器,@Reference注釋不起作用,引用需要被設置在servlet的init()方法中[1]。
下面是基于上述兩種情況的代碼:
(1)servlet容器完全支持SCA的代碼寫法,servlet使用@Reference注釋來查詢ClearingReference服務。
publicclassQuerySettlementServlet extends HttpServlet {
privatestaticfinallongserialVersionUID = 1L;
@Reference
protectedClearingReferenceclearingReference;
(2)servlet容器不完全支持SCA的代碼寫法,servlet通過SCA Component Context來查詢Clearing Reference。Component Context是標準的SCA API。常見的Tomcat服務器是不完全支持SCA的,可以采用下面的寫法。
public void init(ServletConfigconfig) throws ServletException {
if (clearingReference==null){
ComponentContextcontext=(ComponentContext)config.getServletContext().getAttribute("org.osoa.sca.ComponentContext");
clearingReference=context.getService(ClearingReference.class, "ClearingRef-erence");
}
}
2.3 配置TuscanyServletFilter過濾器
在基于Web Service的SCA應用中,要想在Web環境中使用Tuscany提供的功能,需要在web.xml中設置TuscanyServletFilter過濾器。其工作過程如下:當應用服務器啟動、客戶端訪問jsp頁面時,服務器調用Web.xml中Tuscany Servlet Filter過濾器。在Tuscany Servlet Filter過濾器中,首先得到一個WebAppServletHost實例,Web App Servlet Host是在Web應用環境中使用的Tuscany功能提供者;在Web App Servlet Host中,得到一個SCA Domain實例,并將之放入Servlet Context上下文中,以后可藉由相應的key得到此SCA Domain實例,即jsp中成功取得SCADomain實例,根據SCA Domain實例取得Domain域中相應的組件,之后就可以調用組件中的各種業務方法了。
Tuscany Servlet Filter過濾器具體配置:在WEB-INF/目錄下創建web.xml,在web.xml文件中配置Tuscany Servlet過濾器。主要架構內容如下:
……
……
……
將定義的web構件中的組件部署到Tomcat服務器,啟動Tomcat服務器,在瀏覽器中輸入調用遠程服務的jsp頁面,并在頁面輸入要查詢的各項條件,提交后,瀏覽器去調用QuerySettlementServlet.java程序,并使用SCA ComponentContext(SCA API)來查詢ClearingReference服務,Clearing Reference服務再調用遠程服務ClearingService中的接口query All SalersSettle Statements(String strSale,Strings trFundCode,String cfDate1,String cfDate2),根據“代銷機構”“基金代碼”“起始確認日期”“結束確認日期”查詢代銷機構交收資金明細。代碼片斷如下:
protected void doPost(HttpServletRequest request,Http Servlet Response response) throws Servlet Exception,IOException {
……
ssr=clearing Reference.query All Salers Settle Statements(strSaler ID,strFundcode,cfmDate1,cfmDate2);
……}
運行結果如圖4所示。

圖4 代銷機構交收資金明細查詢結果
本文基于 SCA架構與servlet相結合,通過建立web構件、servlet程序及配置servlet過濾器,實現了基于SCA的遠程調用web服務。這種框架利用Tuscany SCA簡化了遠程服務的訪問方式。
[1]Simon Laws,Mark Combellack,Raymond Feng.Tuscany SCA in Action[EB/OL].[2014-06-05].http://www.open-open.com/doc/view/4cd938feb9b34d49a82f664958 a9a248
[2]吳清濤.基于Proxy模式的遠程處理框架研究[J].長江大學學報:自然科學版,2013,10(19):23-26
[3]孫佳慶,俎云霄,李巍海,等.基于JSP的Matlab遠程調用和并行處理[J].計算機科學與應用,2013(3):273-277
[4]周毅,張曉先,陳麗蓉.AUTOSAR 符合性測試適配器的實現方法[J].計算機工程,2014(1):291-294
[5]李海聞,寧敏,林福良,等.一種基于CORBA的分布式應用模型[J].計算機系統應用,2010,19(S1):33-34
[6]紐康莫,勞莫,徐涵,等.Understanding SOA with Web Service:中文版[M].北京:電子工業出版,2006:20-32
[7]劉佑平.SCA在鐵路信息共享平臺中的應用研究[D].北京:北京交通大學研究生院,2008:2-35
[8]焦烈焱,馮興智,楊洪波.SOA中國路線圖[M].北京:清華大學出版社,2009:2-223
(責任編輯:汪材印)
10.3969/j.issn.1673-2006.2014.11.023
2014-07-28
福建省教育廳B類課題科技基金項目“基于Tuslang SCA的應用開發研究”(JB13335)。
唐青(1975-),女,福建福州人,碩士,講師,主要研究方向:計算機信息系統。
TP311.5
A
1673-2006(2014)11-0079-04