摘 要:Web服務是一個嶄新的分布式計算模型,它的研究重點是Web服務的新型構架,Web服務的高效執行方式,Web服務與其他成熟技術的有機結合以及Web服務的集成是解決現實應用問題的重要技術。為了充分發揮 Web 服務的靈活性,用戶必須能夠動態地發現和調用 Web 服務。動態發現Web服務的研究目標是服務發現的高效率和自動化。在此使用Java的開放源碼包uddi4j,wsdl4j和Apache Axis 2來實現Web服務的動態發現與調用的方法。該方法實現了Web服務與Java技術的有機結合,為更高效率的應用Web服務提供一種思路。
關鍵詞:分布式計算模型; Web服務;Java; UDDI
中圖分類號:TN911; TP273 文獻標識碼:A
文章編號:1004-373X(2010)14-0086-03
Dynamic Discovery and Invocation of Web Service Based on Java Technology
SU Jin-zhi,LI Zhi-wu
(Vocational and Technological College, Liaoning Shihua University, Fushun 113001, China)
Abstract:Web service is a new distributed computing model, and it is also an effective mechanism for the data and service integration on the web. Thus, web service has become a solution to E-business. It is important and necessary to carry out the research on the new architecture of web service in combination with other good techniques and on the integration of services. The Web services must be dynamically discovered and invoked in order to give full play to its flexibility, whose research aim is high efficient and automation. According to the Web Service model framework, the method of dynamic discovery and invocation of Web service using the open source packages uddi4j, wsdl4j, and Apache Axis based on Java technologies is introduced. The method, which puts Web service together with Java technologies can effectively make use of Web Service.
Keywords:distributed computing model; Web service; Java; UDDI
0 引 言
Web服務(Web Service)是一種用于應用程序集成的新技術,它并不追求代碼的可移植性,而是要使分布在互聯網中的各種系統實現交互[1]。它是下一代互聯網分布式計算的基本組成單元。Web Service提供者通過Web服務描述語言(web services description language,WSDL)的規范發布Web服務。服務請求者利用UDDI(universal description discovery and integration)協議在服務注冊中心發布注冊,在服務代理中查找所需的服務,根據返回信息的Web服務WSDL描述文件找到服務提供地址,按照服務提供者要求的規范與之綁定,采用SOAP通信使用服務提供者的服務。
Web Service的體系構架是基于服務提供者、服務注冊中心和服務請求者3個角色和發現、發布、綁定3個動作組成的[2]。發布是為了讓用戶或其他服務知道某個Web Service的存在以及相關信息,發現是為了找到合適的Web Service,綁定則是在提供者和使用者之間建立某種聯系。
1 Web服務的動態發現與調用
對于Web Service而言,其典型的體系構架應當如圖1所示[3]。從圖中可以看到,所謂Web服務發現,就是客戶以某種方式在不同類型的Web服務中找到其想要的服務,以執行Web服務請求。Web服務發現是Web服務系統架構中的一個重要部分,UDDI是其中一種解決方案。為了充分發揮 Web 服務的靈活性,用戶必須能夠動態地發現和調用 Web 服務,Web服務發現的研究目標是服務發現的高效率和自動化[4-5]。本文利用Java語言實現了Web服務的動態發現和調用方法。
Web服務發現的具體流程如下:
(1) 服務提供者將服務描述信息發布到UDDI上,以供檢索;
(2) 服務請求者發現來自 UDDI 的關于此服務的信息;
(3) 閱讀來自服務提供者的 WSDL 實現文件并進行解析,以獲取各種信息;
(4) 用 Apache Axis編碼動態請求Web服務。
圖1 Web服務架構
假定Web服務已經被發布到UDDI并等待客戶機請求。在客戶機代碼中,Web服務的動態發現與調用通過使用Java的開放源碼包uddi4j,wsdl4j和Apache Axis 2來實現。其中uddi4j是Java類庫,它可以提供用來與UDDI注冊表交互的API。該類庫生成發送到UDDI服務器和從UDDI服務器接收的消息,并對其語法進行分析;wsdl4j是一個解析和創建WSDL的Java類庫;Apache Axis的主要功能是作為一個 SOAP的實現來讓開發者通過它來構建自己的Web Service [6]。由于uddi4j能提供一個使用戶能夠查詢和發布到任何 UDDI 2.0 注冊中心的 API,所以用uddi4j來瀏覽UDDI注冊中心。wsdl4j包用于以編程方式表示WSDL文件的元素,這樣就可以瀏覽和收集來自該文件的各種信息。然后用Axis向服務器發出真正的Apache SOAP請求并等待應答。
2 Web服務的動態發現與調用的實現
2.1 在UDDI中查找Web服務
為了動態地調用Web服務,首先應知道UDDI注冊中心的查詢URL,UDDI的發布URL、業務實體的名稱以及業務服務的名稱;然后使用UDDI注冊中心的查詢URL 創建到UDDI注冊中心的代理;最后用這個代理對注冊中心進行查詢以查找所需的Web服務[7]。具體實現過程為:
private String uddiURL= \"http://localhost:80/uddisoap/urlapi\";
private String uddiPubURL = \"http://localhost:80/uddisoap/pubapi\";
private String businessName = \"lnpu\";
private String serviceName = \"newspub\";
…
public String findImplURI() {
try {
UDDIProxy proxy=new UDDIProxy(
new URL(uddiURL), new URL(uddiPubURL));
Vector names = new Vector();
names.add(new Name(businessName));
BusinessList businessList= proxy.find_business(names, 1, 1, 1, 1, 1,10);
Vector businessInfoVector= businessList.getBusinessInfos().getBusinessInfoVector();
BusinessInfo businessInfo = 1;
for (int i = 0; i < businessInfoVector.size(); i++) {
businessInfo = (BusinessInfo)businessInfoVector.elementAt(i);
if(businessName.equals(
businessInfo.getNameString())) {
break;
} }
Vector serviceInfoVector=businessInfo.getServiceInfos().getServiceInfoVector();
ServiceInfo serviceInfo = 1;
for (int i = 0; i < serviceInfoVector.size(); i++) {
serviceInfo = (ServiceInfo)serviceInfoVector.elementAt(i);
if(serviceName.equals(serviceInfo.getNameString())) {
break;
} }
ServiceDetail serviceDetail= proxy.get_serviceDetail(serviceInfo.getServiceKey());
Vector businessServices = serviceDetail.getBusinessServiceVector();
BusinessService businessService = 1;
for (int i = 0; i < businessServices.size(); i++) {
businessService = (BusinessService)businessServices.elementAt(i);if(serviceName.equals(
businessService.getDefaultNameString())) {
break;
} }
一旦查到了Web服務,就可以收集服務提供者機器上的WSDL實現的URI。這將由UDDI注冊中心中的tModle的Overview URL元素表示。要查找這個元素,必須先找到業務服務的綁定模板,它包含一個基于HTTP的訪問點。一旦找到了這個模板,那么就可以找到由綁定的模板引用的適當tModel。然后,用綁定模板反復進行對tModel的所有引用,在找到第一個Overview URL(即 WSDL 實現的位置)時停止。既然知道WSDL實現的URL,就可以繼續用 wsdl4j直接請求來自服務提供者的文檔并對其進行解析,從而獲得為了調用服務所需要傳送給Axis的參數。
2.2 解析WSDL
在2.1節中得到了用于Web服務WSDL實現的URL,就可以用 wsdl4j 來解析它。為了使用 Axis 調用該服務,需要從WSDL收集下列信息:目標名稱空間、服務名稱、端口名稱、操作名稱和操作輸入參數。為了收集這些信息,首先需獲取表示WSDL實現和WSDL接口的Definition 對象;接著,通過搜索實現WSDL中定義的所有imports,獲取另一個Definition對象,它表示 WSDL接口;然后,查找要被傳送給Axis的目標名稱空間;最后,查找包含了想要調用的操作的端口。收集到了調用服務所需的所有信息即可以用一個Axis 調用來調用Web服務。
2.3 用Axis調用Web服務
Axis不提供從一個完整的名稱空間創建QName 的構造程序,所以必須把端口名稱分割成名稱空間和本地部件[8-9]。創建一個Service對象(它提供WSDL實現的URL)和QName(它表示端口名稱)。 然后再創建另一個表示服務名稱的QName對象。從Service對象創建Call對象,通過傳入Call對象要調用的端口QName和操作名稱來設置其將調用的操作。最后,調用在解析 WSDL時創建的傳入Object[]參數中的操作。
3 結 語
Web服務的提供者日益增多,服務請求者如何選擇最適合自己的服務成為了一個難題。詹姆斯#8226;戈士林博士曾說過[10]:“Java技術與Web服務之間沒有界限”。本文使用Java語言實現了Web服務的動態發現 和調用,為更好地應用Web服務提供一種思路。
參考文獻
[1]FERRRACCHIA Fabio Claudio. .NET 數據服務[M].毛堯飛,譯.北京:清華大學出版社,2005.
[2]BARWELL Fred, BLAIR Richard.VB.NET高級編程[M].張加榮,譯.北京:清華大學出版社,2005.
[3]劉必欣.動態Web服務組合關鍵技術研究[D].長沙:國防科學技術大學,2005.
[4]岳昆,王曉玲,周傲英.Web服務核心支撐技術研究綜述[J].軟件學報,2004,15(3):428-442.
[5]ONION Fritz.ASP.NET基礎教程[M].北京:清華大學出版社,2003.
[6]毛枝年,強俊,程雙軍.基于Web的信息檢索系統的設計與研究[J].計算機工程與設計,2006(6):1025-1027.
[7]COYLE F P. XML, Web服務和數據革命[M].北京:清華大學出版社,2003.
[8]BALLINGER Keith.NET Web Services架構與實現[M].張曉坤,譯.北京:中國電力出版社,2004.
[9]RIEHTER Jeffrey. Microsoft. NET框架程序設計(修訂版) [M].李建忠,譯.北京:清華大學出版社,2003.
[10]柴曉路.J2EE VS.NET.Web服務誰主沉浮[EB/OL].[ 2004-03-07] .http://www-900.ibm.com/developerWorks/cn/xml/theme/indexcxl.shtml,2004.