AXIS2發佈WebServices服務

最近項目需用同時用c/c++、PHP、JAVA,由於編程語言多樣性導致通訊無法正常使用。所有在這幾種語言中採用WSDL進行通訊。將接口發佈成WebService。發佈的方法有多種就不都去介紹。 我們這兒使用的是axis2,使用這個的原因是c/c++同時也支持,但是c/c++怎麼使用就不介紹了,畢竟我是負責JAVA服務端的。下面開始主要介紹。怎麼使用這些,同時記錄一些遇到的問題。

我所知的使用axis2的方式有兩種,一是直接在axis2的項目裏面下加入自己寫的服務,一種是將axis2集成到自己的服務中。各有優缺點。

先介紹第一種吧,也是我這個項目中使用的。

一:將項目部署在Axis2裏面

默認已經安裝好 jdk 、tomcat 、eclipse

參與進來時主題框架已定。採用了簡便的方式。因爲這個公司主要研發力量是c/c++,能簡便則簡便吧。

1、在官網 http://axis.apache.org/axis2/java/core/download.cgi下載axis2,需要下載的是下面幾個,路徑如下,我這邊下的是現在的最新版本1.7.6的。


2、在eclipse裏面添加一個user Library,名稱自己定,我這兒是axis2,把下載好的axis2-1.7.6-bin裏面的所有的jar包放入進去。


我這兒是已經建好了的。如果沒創建,如下圖所示點擊NEW添加。名字自己定。


找到你下載的axis2-bin,導入jar。(這部分開始忘記說明,今天在公司纔想起,現在加上。公司用的並不是最新的axis2。),因爲後續都要使用到axis2的jar,所有一次性全弄進去。


3、然後直接把下載的axis2.war裏面的拷貝到tomcat服務器下的webapps裏面去,直接運行tomcat。會自動生成一個axis2文件。這裏面就是以後自己寫的webService程序存放的地方。


這時,訪問http://localhost:8080/axis2/你就會發現已經集成好了。


4、安裝eclispe axis2插件用來打包arr發佈。首先用官網下載的axis2-eclipse-codegen-plugin和axis2-eclipse-service-plugin兩個,解壓的jar放入eclipse的dropins裏面,期間要關閉eclipse。


然後在eclipse裏面File->new->axis2,如果出現下面兩個就表示成功了。沒有的話可以百度看看怎麼導致的,可能是eclipse版本不兼容或者其他問題。


5、建立一個簡易的demo程序:主要內容如下


6、接下來打包發佈,File->New->axis2->Axis2 Service Archiver

選擇當前項目的classes目錄


接下來next


下面是jar包添加,如果當前項目有別的導入包則需要一個一個加進去,我這兒的demo並沒有,直接next。


繼續next.



Service Name 是發佈的Webservices名字,也就是以後調用時的名字。class name則是編譯文件的路徑。


最後一步,Output file location 就是arr路徑生成後的位置,我這兒是直接放到發佈的路徑。

output File Name是arr的名字,建議與項目名或者WebServices接口相同。


實際發佈如下,可以將arr文件解壓成文件夾形式,因爲後續可能需要修改裏面的東西。


重啓tomcat後,繼續訪問http://localhost:8080/axis2/services/listServices 和http://localhost:8080/axis2/services/WebServicesDemo/firstDemo,如果如下面所示就表示發佈成功。



路徑絕對不能輸錯,要不然會出現如下情況


7、如果後續需要修改發佈的webService的話,只需要替換掉裏面的class文件就好。


8、如果在同一個項目裏面發佈多個webService的話可以直接修改arr裏面的services.xml文件。同時把class文件以及路徑加到對應的位置。services.xml位置在服務器下的axis2裏面,我這兒是 D:\tomcat\webapps\axis2\WEB-INF\services\WebServicesDemo\META-INF。


例如在同時發佈另外一個demo接口。

先修改service.xml文件。這是修改前的樣子。 name就是在用axis2插件時的名稱。

<service name="WebServicesDemo" >
	<description>
		Please Type your service description here
	</description>
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
		<messageReceiver  mep="http://www.w3.org/ns/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</messageReceivers>
	<parameter name="ServiceClass">com.yzz.webservice.demo.WebServicesDemo</parameter>
</service>

修改後如下所示

<serviceGroup>
<service name="WebServicesDemo" >
	<description>
		Please Type your service description here
	</description>
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
		<messageReceiver  mep="http://www.w3.org/ns/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</messageReceivers>
	<parameter name="ServiceClass">com.yzz.webservice.demo.WebServicesDemo</parameter>
</service>
<service name="demo" >
	<description>
		Please Type your service description here
	</description>
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
		<messageReceiver  mep="http://www.w3.org/ns/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</messageReceivers>
	<parameter name="ServiceClass">com.yzz.webservice.demo.Demo</parameter>
</service>
</serviceGroup>

繼續訪問http://localhost:8080/axis2/services/listServices 就可以看到新加的webServices接口demo了。


第一種方法介紹完畢,下面說這個方法存在的優點已經缺陷。

優點:適合新項目,無需考慮各種兼容問題。

缺點:

一:不方便調試,必須把編譯好的class文件替換重新發布才能看到效果。

二:及其奇葩的一個問題,上圖說明。

這是發佈成功的情況。


但是,如果在tomcat開啓的時候,有別的服務器(c/c++寫的soap服務器)在訪問我們的接口,會導致一個問題,

裏面的這個路徑 <soap:address location="http://localhost:8080/axis2/services/demo.xxx/"/>

會變成這樣<soap:address location="http://localhost:8080//axis2/services/demo.xxx/"/>axis2前面會多一個 / 。所有的調用都無法正常運行。這個路徑是服務自動生成的,也不清楚怎麼改。唯一避免的方式就是確保沒有被調用的情況下開啓服務器。

我個人覺得是在tomcat服務器重啓或者開啓的時候會按默認路徑 http://localhost:8080/axis2/services/demo.xxx/ 來生成對應外部的調用路徑,但是此時有服務器在訪問該路徑,導致這個路徑被佔用。所以tomcat自動產生了另外一個路徑。也就是我們後續看到的那個多了一個反斜槓的路徑。暫時不清楚如何解決。


第二種方式。

這種是直接把axis2集成到自己的項目種去。這種是更加符合現在大部分項目的需求的發佈方式。

1、將第一種方式下載的axis2.war解壓開,去WEB-INF裏面找conf、lib、modules、services,也可以到tomcat我們第一種方法裏面集成的axis2的WEB-INF裏面的去找 這幾個文件。


2、把這些文件夾拷貝到現有項目的WEB-INF裏面去。然後在項目的web.xml中加上啓動配置。目的是tomcat啓動的時候自動加載axis2。

 <servlet>    
   	<servlet-name>AxisServlet</servlet-name>    
    	<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>    
    <load-on-startup>1</load-on-startup>    
</servlet>  
 
<servlet-mapping>    
    <servlet-name>AxisServlet</servlet-name>    
    <url-pattern>/services/*</url-pattern>    
</servlet-mapping> 
</web-app>
3、接下來建立文件夾,如果是用過第一種方法而且後面是按我上面說的一樣直接從tomcat裏面拷貝過來的話,那就無需後面的步驟了,直接訪問http://localhost:8080/WebServices2/services/WebServicesDemo?wsdl就行了。因爲我們第一種方法已經完全配置好了。


4、如果沒有用第一種方法的話。那就繼續看下去吧。如圖所所示,建立文件夾,java文件以及services.xml。我這兒偷懶了,直接把原來的java文件以及services.xml的配置全部複用了。主要步驟是在services目錄建立文件夾,這個名字可以自己定。然後在繼續建立文件夾META-INF(這個是必須按格式來)。



5、添加xml文件services.xml。具體內容如下,和上面第一種方法的圖一樣。

<serviceGroup>
<service name="WebServicesDemo" >
	<description>
		Please Type your service description here
	</description>
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
		<messageReceiver  mep="http://www.w3.org/ns/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</messageReceivers>
	<parameter name="ServiceClass">com.yzz.webservice.demo.WebServicesDemo</parameter>
</service>
<service name="demo" >
	<description>
		Please Type your service description here
	</description>
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
		<messageReceiver  mep="http://www.w3.org/ns/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</messageReceivers>
	<parameter name="ServiceClass">com.yzz.webservice.demo.Demo</parameter>
</service>
</serviceGroup>
6、經過這樣配置後直接訪問http://localhost:8080/WebServices2/services/WebServicesDemo?wsdl 或者http://localhost:8080/WebServices2/services/demo?wsdl就可以成功看到結果。 

7、如果項目除了發佈WebService還有其他傳統型接口,還需要其他更改。例如在SpringMvc裏面同時加入axis2的話。service.xml裏面的配置如下(這個與現在的兩個Demo無關,等具體項目集成好了在詳細介紹)。

<serviceGroup> 
<service name="AxisService">
	<description>AxisService</description>
	<parameter name="ServiceClass">
		com.cms.userdao.UserDao
	</parameter>
	
	<operation name="axis2Login" >
        <messageReceiver  mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    </operation>
</service>

<service name="SpringJdbcService">

        <description>Multy Method Invoke With Parameters For Spring</description>
		<!-- <parameter name="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier</parameter> -->
		<parameter name="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier</parameter>
		<parameter name="SpringBeanName">springAwareService</parameter>//springMvc中bean的配置後續有介紹
		<operation name="getName">//需要發佈的接口
           <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
        </operation>
 
	</service>

</serviceGroup>


springMvc發佈axis2

需要在springmvc的配置文件applicationContext.xml裏面加入以下配置

<!-- axis2發佈接口的配置 -->
	<bean id="springJdbcBean" class="com.cms.demo.SpringJdbcBeanImpl">
  		<property name="dataSource" ref="dataSource" />
  	</bean>
	<bean id="springAwareService" class="com.cms.demo.SpringAwareService">
    	<property name="springJdbcBean" ref="springJdbcBean"/>
  	</bean>

這種方法的優點是調試簡便、方便部署已有的項目。

缺點就是,如果你的項目同時需要發佈webService或者普通的接口的話,需要而外的配置。


以上全部是是自己親自搭建可以正確使用,如有不對之處,歡迎大家指正。

下一篇介紹幾種java端調用webServices的方法。


源碼下載 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章