使用Servicemix(ESB)發(fā)布一個(gè)外部的WebService_第1頁(yè)
使用Servicemix(ESB)發(fā)布一個(gè)外部的WebService_第2頁(yè)
使用Servicemix(ESB)發(fā)布一個(gè)外部的WebService_第3頁(yè)
使用Servicemix(ESB)發(fā)布一個(gè)外部的WebService_第4頁(yè)
使用Servicemix(ESB)發(fā)布一個(gè)外部的WebService_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、首先我們需要了解一下相關(guān)概念,什么SOA,什么是ESB 面向服務(wù)的體系結(jié)構(gòu)(Service-Oriented Architecture,SOA)是一個(gè)組件模型,它將應(yīng)用程序的不同功能單元(稱(chēng)為服務(wù))通過(guò)這些服務(wù)之間定義良好的接口和契約聯(lián)系起來(lái)。接口是采用中立的方式進(jìn)行定義的,它應(yīng)該獨(dú)立于實(shí)現(xiàn)服務(wù)的硬件平臺(tái)、操作系統(tǒng)和編程語(yǔ)言。這使得構(gòu)建在各種這樣的系統(tǒng)中的服務(wù)可以一種統(tǒng)一和通用的方式進(jìn)行交互。這是完整的定義:1 是一個(gè)組件模型2 不同功能單元,稱(chēng)為服務(wù)3 服務(wù)之間通過(guò)接口和約定聯(lián)系起來(lái)4 接口是中立的 ESB全稱(chēng)為Enterprise Service Bus,即企業(yè)服務(wù)總線

2、。它是傳統(tǒng)中間件技術(shù)與XML、Web服務(wù)等技術(shù)結(jié)合的產(chǎn)物。ESB提供了網(wǎng)絡(luò)中最基本的連接中樞,是構(gòu)筑企業(yè)神經(jīng)系統(tǒng)的必要元素。ESB的出現(xiàn)改變了傳統(tǒng)的軟件架構(gòu),可以提供比傳統(tǒng)中間件產(chǎn)品更為廉價(jià)的解決方案,同時(shí)它還可以消除不同應(yīng)用之間的技術(shù)差異,讓不同的應(yīng)用服務(wù)器協(xié)調(diào)運(yùn)作,實(shí)現(xiàn)了不同服務(wù)之間的通信與整合。從功能上看,ESB提供了事 件驅(qū)動(dòng)和文檔導(dǎo)向的處理模式,以及分布式的運(yùn)行管理機(jī)制,它支持基于內(nèi)容的路由和過(guò)濾,具備了復(fù)雜數(shù)據(jù)的傳輸能力,并可以提供一系列的標(biāo)準(zhǔn)接口。 Servicemix是什么?Servicemix是apache發(fā)布的一種ESB。參考官方頁(yè)http:/servicemix

3、. Servicemix上服務(wù)的實(shí)現(xiàn) Servicemix上可以直接發(fā)布Webservice和POJOs之類(lèi)的程序或者模塊,也可以發(fā)布一個(gè)類(lèi)似于代理的服務(wù)。從流程上來(lái)說(shuō):Servicemix使用consumer接受到客戶(hù)request,在Servicemix的服務(wù)列表中尋找服務(wù),并且發(fā)布一個(gè)EndPoint,然后再provider中發(fā)布一個(gè)指向目標(biāo)service的服務(wù)。 Service Unit  和  Service Assembly如字面意思,service unit就是一個(gè)一個(gè)的服務(wù)單元,而service assembly是這些

4、單元的集合在servicemix上發(fā)布一項(xiàng)服務(wù),其實(shí)是發(fā)布一個(gè)服務(wù)集(SA),在這個(gè)集合中,可能存在一個(gè)或者多個(gè)服務(wù)(SU)例如,我們有一個(gè)服務(wù)需要順序使用兩個(gè)webservice,那個(gè)我們可以定義兩個(gè)SU分別對(duì)應(yīng)不同的webservice,然后使用一個(gè)SA將這兩個(gè)SU統(tǒng)合起來(lái)這樣,我們就可以調(diào)用一個(gè)暴露在外面的服務(wù)(該SA的服務(wù)),來(lái)達(dá)到使用兩個(gè)webservice的目的 本文的目標(biāo)我們的目標(biāo)是讓Servicemix充當(dāng)一個(gè)Proxy,即將一個(gè)外部的WebService發(fā)布到ServiceMix服務(wù)當(dāng)中。使得客戶(hù)可以通過(guò)調(diào)用暴露在外面的Servicemix的服務(wù)端口來(lái)調(diào)用實(shí)際上在其

5、他服務(wù)器上的 WebService。 實(shí)現(xiàn)這個(gè)目標(biāo),可以通過(guò)兩種組件完成。1,Servicemix-Http-bc2,Servicemix-CXF-bc Http-bc的優(yōu)點(diǎn)是使用范圍非常的廣,缺點(diǎn)是使用非常麻煩。也就是說(shuō)大多數(shù)組件都要我們自己定義。Cxf-bc的優(yōu)點(diǎn)是比較簡(jiǎn)單。這個(gè)組件本身集成了對(duì)現(xiàn)有大多數(shù)Soap/Http形式的支持,對(duì)于沒(méi)有特定要求的使用來(lái)說(shuō)是足夠了。 順便一提Http-se和Cxf-se,這兩個(gè)是相對(duì)于上面兩個(gè)而言的,這兩個(gè)是服務(wù)引擎,對(duì)象一般是實(shí)際的Class或者Application Servicemix的教程參考:http:

6、//tutorials.htmlCXF教程參考:/4- beginner-web-services-with-servicemix-and-cxf.html 本文使用CXF-bc來(lái)實(shí)現(xiàn),參考:/servicemix-cxf- bc.html 所需工具:apache-Servicemix-3.2.2 release (據(jù)官方說(shuō),開(kāi)源變化很大,最新的比較完備,至少需要3.2以上版本)http:/servicemix.apache.

7、org/download.htmlapache-Maven 2.0以上版本/download.htmlJDK1.5以上版本apache-axis2/axis2/download.cgiapache-tomcatapache eclipse wsdl 插件(Service Archive Wizard - Eclipse Plug-in,Code Generator Wizard - Eclipse Plug-in等)/axis2/tools/index.html 示

8、例:1,安裝好JDK,并且配置好JDK的環(huán)境變量 2,安裝好Maven,并且配置好Maven的環(huán)境變量        環(huán)境變量:        M2_HOME :                       

9、;      解壓Maven的目錄        M2:                        ;           &

10、#160;         &nbs p;M2_HOME%/bin        MAVEN_OPTS :                       - Xms256m -Xmx512m  

11、      Path:                        ;                    %M2%

12、 3,安裝好Servicemix        測(cè)試:在CMD下,Servciemix安裝目錄下        運(yùn)行              cd bin            

13、servicemix        則服務(wù)器啟動(dòng)        在http:/localhost:8192/可以看到服務(wù)器已經(jīng)在運(yùn)行。 4,安裝好Tomcat,并且配置好環(huán)境變量 5,安裝好Axis2,并且配置好環(huán)境變量            注:這里可以使用簡(jiǎn)單方式,下載Axis2的war包,直接

14、發(fā)布到Tomcat中就可以。             測(cè)試:http:/localhost:8080/下檢查新添加的Axis2服務(wù) 6,將Service Archive Wizard - Eclipse Plug-in等插件裝進(jìn)Eclipse            注:這些插件不是必要的,僅僅可以使工作變得簡(jiǎn)單一些。 7,打開(kāi)E

15、clipse并新建動(dòng)態(tài)Web工程(Eclipse需要WTP插件)          輸入Project名字HelloWorld,然后點(diǎn)擊finish 8,在新建的工程中添加class        在新建的project的src中添加一個(gè)package        package名字為sample  

16、60;       在該包中添加一個(gè)class         Class的名字為Hello,點(diǎn)擊Finish         修改java文件的內(nèi)容如下。  9,生成wsdl文件        這里可以用Code Generator Wizard

17、- Eclipse Plug-in插件生成,也可以用其他插件生成,差別不大          以上兩種方法都可以,第二種只要按照提示來(lái)就可以了,分別是選擇class,選擇生成路徑        下面說(shuō)第一種方法          注:這里如果想測(cè)試的話,就把左上條子拉到頂,點(diǎn)擊finish  

18、60;       測(cè)試:點(diǎn)擊Operations中剛剛發(fā)布Say          輸入World,看到返回值正常 10,發(fā)布webservice        發(fā)布WebService有很多種方式,可以把它直接發(fā)布Tomcat中,也可以利用Axis來(lái)發(fā)布       

19、; 我們使用Axis2來(lái)發(fā)布        注意,我們要發(fā)布到Axis2中,所以我們service的address就變了,這里需要根據(jù)實(shí)際發(fā)布地址進(jìn) 行修改         例如本示例修改如上1. <wsdlsoap:address location="http:/localhost:8080/axis2/services/HelloService"/>  

20、;      使用插件Service Archive Wizard - Eclipse Plug-in          點(diǎn)擊Next,然后選擇Class文件的路徑          點(diǎn)擊Next,選擇我們剛剛發(fā)布的wsdl         

21、0;點(diǎn)擊Next,然后來(lái)選擇必要的jar包。          點(diǎn)擊Next,勾選自動(dòng)生成Service.xml          點(diǎn)擊Next,填選Class          點(diǎn)擊Next,填寫(xiě)發(fā)布路徑        

22、;  點(diǎn)擊Finish,則在目標(biāo)路徑生成aar文件         將生成的aar文件復(fù)制到%Tomcat%/webapps/axis2/WEB-INF/services下,或者在axis2的admin頁(yè)面添 加該aar文件          默認(rèn)的用戶(hù)名是admin,密碼是axis2        

23、0; 點(diǎn)擊Upload Service          將剛剛生成的wsdl發(fā)布          發(fā)布成功后,就可以在Service中找到剛剛發(fā)布HelloService          點(diǎn)擊HelloService,我們就可以看到這個(gè)服務(wù)的具體內(nèi)容,就是我們剛剛發(fā)布wsdl。

24、60;       至此,我們成功地發(fā)布了一個(gè)webservice *以上示例使用的是POJOs形式發(fā)布。 11,運(yùn)行Servicemix         運(yùn)行cmd,然后啟動(dòng)servicemix服務(wù)          等待服務(wù)完全開(kāi)啟。       

25、;   當(dāng)啟動(dòng)成功之后。我們就可以在JDK的控制臺(tái)看到關(guān)于ServiceMix的服務(wù)信息        運(yùn)行  %JDK%/bin/jconsole.exe          則我們可以找到servicemix的服務(wù)已經(jīng)開(kāi)啟          點(diǎn)擊連接,則我們可以看到servic

26、emix中的所有信息,包括所有的操作及消息隊(duì)列等等,在此不多述。 12,新建一個(gè)Servicemix的組件        我們的目的是WebService,所以我們建一個(gè)Cxf-bc的組件        在任意路徑下建一個(gè)項(xiàng)目工程的目錄,示例建立的是D:/CXFHello        運(yùn)行cmd,進(jìn)入該目錄   &#

27、160;    鍵入1. mvn archetype:create -DarchetypeGroupId=org.apache.servicemix.tooling -DarchetypeArtifactId=servicemix- project-root -DgroupId=org.apache.servicemix.tutorial -DartifactId=tutorial-wsdl-cxf-service       

28、0;用來(lái)創(chuàng)建一個(gè)標(biāo)準(zhǔn)的pom.xml        在這個(gè)pom.xml中,對(duì)于一些基本的工程配置作了設(shè)定          在我們成功建立了之后,會(huì)發(fā)現(xiàn)CXFHello文件夾下面多出了一個(gè)路徑        則我們?cè)谶@個(gè)新建的路徑下面運(yùn)行1. mvn install     &

29、#160;   至此,我們已經(jīng)將這個(gè)新建的工程發(fā)布到我們的本地 Maven repository 中         下面我們建立一個(gè)CXF-BC Service Unit        在我們剛才建立的工程文件夾下面,運(yùn)行1. mvn archetype:create -DarchetypeGroupId=org.apache.servicemix.tooling 

30、-DarchetypeArtifactId=servicemix- cxf-bc-service-unit -DgroupId=org.apache.servicemix.examples -DartifactId=my-cxf-bc-su        用來(lái)創(chuàng)建一個(gè)標(biāo)準(zhǔn)的CXF-BC-SU組件         至此,我們建議了一個(gè)標(biāo)準(zhǔn)的CXF-BC-SU組件的框子   

31、60;            現(xiàn)在進(jìn)入新建的組件的文件夾。        我們看到一個(gè)pom.xml文件,這個(gè)是對(duì)這個(gè)組件進(jìn)行配置的一個(gè)文件。        打開(kāi),我們可以看到詳細(xì)內(nèi)容        現(xiàn)在我們修改這個(gè)組件的名字 &

32、#160;      將<name>A Cxf BC Service Unit</name>        改成<name>Cxf-Hello-SU</name> 然后我們需要將我們發(fā)布在Axis2上的Webservice的wsdl復(fù)制下來(lái)放入servicemix這個(gè)bc組建之中。         關(guān)于wsdl

33、文件            打開(kāi)wsdl文件,我們可以發(fā)現(xiàn),wsdl其實(shí)定義了webservice的所有規(guī)范,例如它的名字,接 口,方法,參數(shù)等等            而我們需要將wsdl復(fù)制到我們要發(fā)布的servicemix當(dāng)中,是因?yàn)槲覀儽┞冻鋈サ慕涌?,方法?參數(shù)等要能和實(shí)際服務(wù)的webservice一致。所以servicemix當(dāng)中需要一個(gè)由同樣接

34、口定義的wsdl文件         訪問(wèn)  http:/localhost:8080/axis2/services/HelloService?wsdl                得到我們剛才發(fā)布的webservice的wsdl文件        

35、0; 將這個(gè)wsdl文件復(fù)制到%/my-cxf-bc-su/src/main/resources  下        其實(shí)這里原本就預(yù)訂了一個(gè)wsdl文件的位置。        注意,我的wsdl名字叫做Hello.wsdl,因此,當(dāng)復(fù)制過(guò)來(lái)后,原來(lái)的service.wsdl就可以刪除了        當(dāng)然,我們也可以把剛才ecilpse

36、項(xiàng)目中生成的wsdl復(fù)制過(guò)來(lái),這是一樣的文件                現(xiàn)在我們需要修改這個(gè)復(fù)制進(jìn)來(lái)的wsdl文件        將webservice服務(wù)定義作如下替換1.    <wsdl:service name="HelloServiceProxy"> 2.3.  

37、     <wsdl:port binding="impl:HelloSoapBinding" name="HelloProxy"> 4.5.          <wsdlsoap:address location="http:/localhost:8193/HelloWorld/"/> 6.7.     

38、;  </wsdl:port> 8.9.    </wsdl:service>        結(jié)果如下圖         現(xiàn)在我們已經(jīng)完成了對(duì)wsdl的設(shè)定,現(xiàn)在我們需要在xbean.xml設(shè)定consumer和provider來(lái)幫定這些東西。        打開(kāi)xbean.

39、xml,作如下修改            首先,我們需要一個(gè)namespace,這個(gè)namespace要和我們引用的wsdl中的service和 endpoint的namespace一致,這樣我們才能準(zhǔn)確找到service和接口            我們的wsdl定義的targetNamespace="http:/sample"

40、0;           所以我們bc組件中的consumer和provider定義的namespace也必須和上面一樣         現(xiàn)在來(lái)定義consumer和provider,基本的定義規(guī)則參照:/servicemix-cxf-bc.html        

41、 則最終修改好的文件如下          注:這里采用輕量級(jí)模式,即,將consumer和provider寫(xiě)在一個(gè)service unit內(nèi),如果想在中間加入其它程序,則可以將 consumer和provider分成兩個(gè)service unit                這樣service unit就建好了,接下來(lái)我們建立

42、service assembly         在我們的工程路目下運(yùn)行1. mvn archetype:create -DarchetypeGroupId=org.apache.servicemix.tooling -DarchetypeArtifactId=servicemix- service-assembly -DgroupId=org.apache.servicemix.examples -DartifactId=my-cxf-sa  

43、       現(xiàn)在可以看到工程目錄中新建出來(lái)了SA的文件夾        同樣,我們修改一個(gè)名字        <name>Cxf-Hello-SA</name>         接下來(lái),我們要在這個(gè)SA中注冊(cè)我們剛才制作的SU1.   

44、; 2.  <dependencies> 3.     <dependency> 4.       <groupId>org.apache.servicemix.examples</groupId> 5.       <artifactId>my-cxf-bc-su</artifactId> 6.      

45、; <version>1.0-SNAPSHOT</version> 7.     </dependency> 8.   </dependencies> 9.         好了現(xiàn)在一切就緒,我們?cè)诠こ棠夸浵旅孢\(yùn)行1. mvn install        就可以建立好組件了   

46、      在build successful之后,我們就可以在        %/my-cxf-sa/target        目錄下面看到我們建立好的jar包          將這個(gè)jar包復(fù)制到servicemix目錄下面的/hotdeploy文件夾,來(lái)正式發(fā)布到ser

47、vicemix當(dāng)中          如此一來(lái),我們就成功的發(fā)布了一個(gè)服務(wù)到servicemix上                下面讓我們來(lái)檢測(cè)一下成果        建立一個(gè)客戶(hù)端html如下 1. <html> 2. <hea

48、d> 3. <title>ServiceMix WSDL -First Example</title> 4. <script type="text/javascript"> 5. var urlToOpen = "http:/localhost:8193/HelloWorld/" /default URL to open 6.7. function getHTTPObject()  8. 

49、60; var xmlhttp = false; 9.10.   /* Compilation conditionnelle d'IE */ 11.   /*cc_on 12.   if (_jscript_version >= 5) 13.      try  14.        

50、 xmlhttp = new ActiveXObject ("Msxml2.XMLHTTP"); 15.       catch (e)  16.         try  17.            xmlhttp = new 

51、;ActiveXObject ("Microsoft.XMLHTTP"); 18.          catch (E)  19.            xmlhttp = false; 20.          21.    &

52、#160;  22.   else 23.      xmlhttp = false; 24.   end */ 25.26.   /* on essaie de créer l'objet si ce n'est pas déjà&nb sp;fait */ 27.  &#

53、160;if (!xmlhttp && typeof XMLHttpRequest != 'undefined')  28.      try  29.         xmlhttp = new XMLHttpRequest (); 30.       catch&

54、#160;(e)  31.         xmlhttp = false; 32.       33.    34.35.   if (xmlhttp)  36.      /* on définit ce qui doit se passer&#

55、160;quand&nbs p;la page répondra */ 37.      xmlhttp.onreadystatechange=function()  38.         if (xmlhttp.readyState = 4)   /* 4 : état "complete&quo

56、t; */ 39.            var response = document.getElementById ("response"); 40.            var responseStatus = "" 41.    

57、        try  42.              responseStatus = xmlhttp.status + "" 43.             catch (e)

58、60; 44.              responseStatus = "ERROR WHILE RETRIEVING STATUS; MAYBE UNABLE TO CONNECT." 45.             46.  

59、60;         response.value = "STATUS: " + responseStatus + "/n" + xmlhttp.responseText; 47.          48.       49.  

60、0; 50.   return xmlhttp; 51. 52.53. function send()  54.   if (document.getElementById("urlToOpen").value != urlToOpen) &&  (document.getElementById("urlToOpen").value != "")  55.  &

61、#160;  /use user entry only if it at least can be oka y 56.     urlToOpen = document.getElementById("urlToOpen").value; 57.      58.   var xmlhttp = getHTT

62、PObject(); 59.   if (!xmlhttp)  60.     alert('cound not create XMLHttpRequest object'); 61.     return; 62.    63.   var request = document.getElementById("request");

63、 64.   var response = document.getElementById("response"); 65.   try  66.     netscape.security.PrivilegeManager.enablePrivilege ("UniversalBrowserRead UniversalBrowserWrite"); 67.    catch (e)&#

64、160; 68.    69.   try  70.     xmlhttp.open("POST", urlToOpen, true); 71.    catch (e)  72.     alert('error opening'); 73.    74.   xmlhttp.send(request.val

65、ue); 75. 76. </script> 77. </head> 78.79. <body> 80.81. <h1>ServiceMix CXF example</h1> 82.83. <p>Welcome to the CXF example for ServiceMix</p> 84.85. <p>Perform a POST into the HTTP binding. This requires JavaScr ipt.</p>  86. <p>Target: <input type="text" size="50&quo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論