使用axis2进行WebService的开发
Apache Axis2 是 Apache Axis SOAP 项目的后继项目。此项目是 Web 服务核心引擎的重要改进,目标是成为 Web 服务和面向服务的体系结构(Service-Oriented Architecture,SOA)的下一代平台。
axis2 WebService开发分为服务端开发与客户端开发,服务端开发为对外提供服务,客户端开发为用户调用外部接口进行业务处理。
有以下下载列表:
Binary Distribution zip | MD5 | PGP
Source Distribution zip | MD5 | PGP
WAR Distribution zip | MD5 | PGP
Documents Distribution zip | MD5 | PGP
注:
axis2-1.6.2-bin.zip里有axis2的jar包。
axis2-1.6.2-docs.zip里有详细的帮助文档。
axis2-1.6.2-src.zip里是源代码。
axis2-1.6.2-war.zip里是axis的管理平台,放到tomcat可直接使用。
注:本文用bin包进行命令行使用axis2,管理平台使用的是war包。
设置环境变量。【注:前提需要配置java环境变量】
AXIS2_HOME 设置值 D:\axis2-1.6.2
Path 添加值 %AXIS2_HOME%\bin
访问地址http://127.0.0.1:8080/axis2/services/listServices 另可访问服务列表。
在浏览器地址栏中输入如下的URL:
http://127.0.0.1:8080/axis2/services/listServices 即可访问刷新后的服务列表。【注:POJO类不能使用package关键字声明包,若使用axis2管理平台发布,则需要修改UserService类,去掉package字段。】
【注:发布WebService的pojo目录只是默认的,如果想在其他的目录发布WebService,可以打开axis2/WEB-INF/conf/axis2.xml文件,并在<axisconfig>元素中添加如下的子元素:
<deployer extension=".class" directory="mydir" class="org.apache.axis2.deployment.POJODeployer"/>】
访问 http://127.0.0.1:8080/axis2/services/UserService?wsdl 即可访问服务UserService的wsdl描述
【注:另可使用jar cvf命令将服务打成aar包后导入到axis2管理平台上使用。】
使用cmd命令,在命令行中输入:
java2wsdl -cn com.hsinghsu.service.UserService
【注:在testAsixServer项目的classes根目录下执行】
输出:
Using AXIS2_HOME: D:\axis2-1.6.2
Using JAVA_HOME: C:\Program Files\Java\jdk1.6.0_01
log4j:WARN No appenders could be found for logger (org.apache.axis2.util.Loader).
log4j:WARN Please initialize the log4j system properly.
结果:
生成UserService.wsdl文件
通过soapUI生成MockService。
启动MockService,测试MockService时,在URL填写http://HSING-PC:8088/mockUserServiceSoap11Binding 后点击运行,查看是否有正确报文返回。
soapUI发送报文如下:
soapUI接收报文如下: 在soapUI中导出war包,如testUser.war。
启动tomcat,访问在war所在的路径如 http://127.0.0.1:8080/testUser/mockUserServiceSoap11Binding?WSDL ,即可查看wsdl描述文件
【注:可以使用soapUI测试接口,在soapUI测试中,URL中填写testUser.war的部署地址,如http://ip:port/testUser/mockUserServiceSoap11Binding ,点击运行,查看对应的接口是否有正确报文返回。】
Axis2支持以下4种类型的客户端:
i. Block(阻塞式客户端),即传统客户端。一旦服务被启用,客户端的应用程序将被挂起,直到operation被执行完毕(表现为收到一个response或fault),才能重新获得控制权。这是调用Web Service最简单的方式,并且这种方式适用于多数业务情形。
ii. Non block(非阻塞式客户端),即异步客户端。使用Non-Blocking API来调用这些Web Services。Axis2提供给用户一种基于回叫机制的non-blocking API,一旦服务被起用,客户端应用程序马上得到控制权,通过使用一个callback对象来获得response。这种方式使得客户端应用程序可以很方便的同步启用多个Web Service。
iii.双工(双向传输)。以上的机制都使用单一的连接去发送请求和接收响应.这都明显在性能上落后于使用两条连接(单向或双向)进行进行请求和响应的传输 . 因此以上的机制都不能解决长时间运行的交易, 连接将在操作还没完成就会超时. 一种解决方案是使用分开的两条传输连接来传输请求和响应 . 我们叫这种方案为传输层异步。
iv. 双工非阻塞(双向且非阻塞传输)。
注:axis2 webservice client端需要的jar包有:
AsixRPCClient.java代码如下:
运行结果:
objects size-->:1[Ljava.lang.Object;@ba5c7a
==1 ==hsinghsu ==wh
输入:
wsdl2java -uri UserService.wsdl
【注:默认adb生成方式,同步生成方式,加参数-a则使用异步生成】
输出:
Using AXIS2_HOME: D:\axis2-1.6.2
Using JAVA_HOME: C:\Program Files\Java\jdk1.6.0_01
Retrieving document at 'UserService.wsdl'.
log4j:WARN No appenders could be found for logger (org.apache.axis2.description.WSDL11ToAllAxisServicesBuilder).
log4j:WARN Please initialize the log4j system properly.
结果:
生成build.xml、UserServiceStub.java、UserServiceCallbackHandler.java文件
AsixServiceStub.java代码如下: 运行结果:
==1 ==hsinghsu ==wh
注:添加UserServiceStub.java、UserServiceCallbackHandler.java文件至项目中,注意修改UserServiceStub.java类中服务的地址。
注:若需要使用异步调用,则需创建异步回调类AsynCallback,该类需要继承UserServiceCallbackHandler抽象类,实现回调函数receiveResultgetUserById接口。在AsixServiceStub中,只需要使用stub.startgetUserById(guid, new AsynCallback());执行即可。
Apache Axis2 是 Apache Axis SOAP 项目的后继项目。此项目是 Web 服务核心引擎的重要改进,目标是成为 Web 服务和面向服务的体系结构(Service-Oriented Architecture,SOA)的下一代平台。
axis2 WebService开发分为服务端开发与客户端开发,服务端开发为对外提供服务,客户端开发为用户调用外部接口进行业务处理。
一、下载与安装
1.下载
下载地址:http://axis.apache.org/axis2/java/core/download.cgi有以下下载列表:
Binary Distribution zip | MD5 | PGP
Source Distribution zip | MD5 | PGP
WAR Distribution zip | MD5 | PGP
Documents Distribution zip | MD5 | PGP
注:
axis2-1.6.2-bin.zip里有axis2的jar包。
axis2-1.6.2-docs.zip里有详细的帮助文档。
axis2-1.6.2-src.zip里是源代码。
axis2-1.6.2-war.zip里是axis的管理平台,放到tomcat可直接使用。
注:本文用bin包进行命令行使用axis2,管理平台使用的是war包。
2.安装配置
将axis2-1.6.2-bin.zip解压到本地目录D:\axis2-1.6.2设置环境变量。【注:前提需要配置java环境变量】
AXIS2_HOME 设置值 D:\axis2-1.6.2
Path 添加值 %AXIS2_HOME%\bin
二、服务端编写
1.创建服务端的java项目testAsixServer。
编写类City与类User代码如下: 编写服务类UserService。该服务类即为对外提供的服务,其中对外提供2个服务getUserById与getUserList,代码如下:2.发布WebService服务
发布WebService服务方式可使用axis2管理平台发布,本文另添加使用soapUI发布WebService的测试服务。2.1 axis2管理平台发布
2.1.1 部署axis2管理平台
将axis2-1.6.1-war.zip压缩包里面的axis2.war包解压到tomcat的webapps目录下,启动tomcat,访问地址http://127.0.0.1:8080/axis2/ ,即可访问axis2的Welcome!页面。访问地址http://127.0.0.1:8080/axis2/services/listServices 另可访问服务列表。
2.1.2 部署开发服务
编译服务端项目testAsixServer后,将UserService.class文件放到tomcat\webapps\axis2\WEB-INF\pojo目录中【注:若没有pojo目录,则手动新建该目录】。在浏览器地址栏中输入如下的URL:
http://127.0.0.1:8080/axis2/services/listServices 即可访问刷新后的服务列表。【注:POJO类不能使用package关键字声明包,若使用axis2管理平台发布,则需要修改UserService类,去掉package字段。】
【注:发布WebService的pojo目录只是默认的,如果想在其他的目录发布WebService,可以打开axis2/WEB-INF/conf/axis2.xml文件,并在<axisconfig>元素中添加如下的子元素:
<deployer extension=".class" directory="mydir" class="org.apache.axis2.deployment.POJODeployer"/>】
访问 http://127.0.0.1:8080/axis2/services/UserService?wsdl 即可访问服务UserService的wsdl描述
【注:另可使用jar cvf命令将服务打成aar包后导入到axis2管理平台上使用。】
2.2 使用soapUI生成WAR发布WebService测试服务
2.2.1 由java生成wsdl文件
运用Java2wsdl生成wsdl文件使用cmd命令,在命令行中输入:
java2wsdl -cn com.hsinghsu.service.UserService
【注:在testAsixServer项目的classes根目录下执行】
输出:
Using AXIS2_HOME: D:\axis2-1.6.2
Using JAVA_HOME: C:\Program Files\Java\jdk1.6.0_01
log4j:WARN No appenders could be found for logger (org.apache.axis2.util.Loader).
log4j:WARN Please initialize the log4j system properly.
结果:
生成UserService.wsdl文件
2.2.2 soapUI导出war包:
在soapUI导入UserService.wsdl文件。通过soapUI生成MockService。
启动MockService,测试MockService时,在URL填写http://HSING-PC:8088/mockUserServiceSoap11Binding 后点击运行,查看是否有正确报文返回。
soapUI发送报文如下:
soapUI接收报文如下: 在soapUI中导出war包,如testUser.war。
2.2.3 部署war包
将war包部署到tomcat目录下。【注:需要修改war包里面的WEB-INF/soapui/testUser-soapui-project.xml文件引用wsdl文件的路径】启动tomcat,访问在war所在的路径如 http://127.0.0.1:8080/testUser/mockUserServiceSoap11Binding?WSDL ,即可查看wsdl描述文件
【注:可以使用soapUI测试接口,在soapUI测试中,URL中填写testUser.war的部署地址,如http://ip:port/testUser/mockUserServiceSoap11Binding ,点击运行,查看对应的接口是否有正确报文返回。】
三、客户端编写
Axis2支持以下4种类型的客户端:
i. Block(阻塞式客户端),即传统客户端。一旦服务被启用,客户端的应用程序将被挂起,直到operation被执行完毕(表现为收到一个response或fault),才能重新获得控制权。这是调用Web Service最简单的方式,并且这种方式适用于多数业务情形。
ii. Non block(非阻塞式客户端),即异步客户端。使用Non-Blocking API来调用这些Web Services。Axis2提供给用户一种基于回叫机制的non-blocking API,一旦服务被起用,客户端应用程序马上得到控制权,通过使用一个callback对象来获得response。这种方式使得客户端应用程序可以很方便的同步启用多个Web Service。
iii.双工(双向传输)。以上的机制都使用单一的连接去发送请求和接收响应.这都明显在性能上落后于使用两条连接(单向或双向)进行进行请求和响应的传输 . 因此以上的机制都不能解决长时间运行的交易, 连接将在操作还没完成就会超时. 一种解决方案是使用分开的两条传输连接来传输请求和响应 . 我们叫这种方案为传输层异步。
iv. 双工非阻塞(双向且非阻塞传输)。
注:axis2 webservice client端需要的jar包有:
1.传统客户端【阻塞式客户端的编写】
新建AsixBlockClient类,获取数据,代码如下: 执行结果如下:2.使用RPC方法调用WebService
编写AsixRPCClient.java类,获取数据。注:添加User.java、City.java至项目中。AsixRPCClient.java代码如下:
运行结果:
objects size-->:1[Ljava.lang.Object;@ba5c7a
==1 ==hsinghsu ==wh
3.使用Stub方式调用WebService
运用wsdl2java简化客户端,使用Stub方式调用WebService3.1 生成STUB文件。
在cmd中用 wsdl2java生成stub文件。注:在wsdl文件目录下执行输入:
wsdl2java -uri UserService.wsdl
【注:默认adb生成方式,同步生成方式,加参数-a则使用异步生成】
输出:
Using AXIS2_HOME: D:\axis2-1.6.2
Using JAVA_HOME: C:\Program Files\Java\jdk1.6.0_01
Retrieving document at 'UserService.wsdl'.
log4j:WARN No appenders could be found for logger (org.apache.axis2.description.WSDL11ToAllAxisServicesBuilder).
log4j:WARN Please initialize the log4j system properly.
结果:
生成build.xml、UserServiceStub.java、UserServiceCallbackHandler.java文件
3.2 编写同步调用函数
编写AsixServiceStub类,获取数据。AsixServiceStub.java代码如下: 运行结果:
==1 ==hsinghsu ==wh
注:添加UserServiceStub.java、UserServiceCallbackHandler.java文件至项目中,注意修改UserServiceStub.java类中服务的地址。
注:若需要使用异步调用,则需创建异步回调类AsynCallback,该类需要继承UserServiceCallbackHandler抽象类,实现回调函数receiveResultgetUserById接口。在AsixServiceStub中,只需要使用stub.startgetUserById(guid, new AsynCallback());执行即可。