Axis中有一个basicHandler的抽象类,这个类可以供我们继承。可以完成很多复杂的功能,如:统计当前服务被调用的次数、验证服务调用信息等待
1、下面我们继承这个类,完成统计服务调用次数的功能;
RequestHandler代码如下:

package com.hoo.service.handler; import org.apache.axis.AxisFault; import org.apache.axis.MessageContext; import org.apache.axis.handlers.BasicHandler; /** * <b>function:</b>继承抽象类BasicHandler完成服务的调用统计功能 * @author hoojo * @createDate Dec 15, 2010 11:00:20 PM * @file RequestHandler.java * @package com.hoo.service.handler * @project AxisWebService * @blog http://blog.youkuaiyun.com/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class RequestHandler extends BasicHandler { private static final long serialVersionUID = 2128841024713159133L ; private static long COUNT = 0L ; private static int REQUEST_COUNT = 0 ; public void invoke(MessageContext msgContext) throws AxisFault { /** * MessageContext相当于当前Services的一个上下文, * 里面存储的是当前服务和调用的一些信息 */ COUNT ++ ; REQUEST_COUNT ++ ; String state = (String) this .getOption( " state " ); System.out.println( " state: " + state + " , count: " + COUNT + " , requestCount: " + REQUEST_COUNT); } }
BasicHandler是一个抽象类,继承这个类需要实现invoke签名方法,上面的代码很简单,就是一个累加统计,MessageContext是当前WebService的一个上下文,可以得到当前服务的公共信息和请求信息。这里的this.getOption("state");是和wsdd中的parameter对应的。
2、编写wsdd文件,加入RequestHandler配置信息,wsdd配置如下:
deployHandler.wsdd:

<? xml version="1.0" encoding="UTF-8" ?> < deployment xmlns ="http://xml.apache.org/axis/wsdd/" xmlns:java ="http://xml.apache.org/axis/wsdd/providers/java" > < handler name ="RequestHandler" type ="java:com.hoo.service.handler.RequestHandler" > < parameter name ="state" value ="success" /> </ handler > < service name ="HelloWorldWSDDHandler" provider ="java:RPC" > < requestFlow > < handler type ="RequestHandler" /> </ requestFlow > < parameter name ="className" value ="com.hoo.service.HelloWorldWSDD" /> <!-- * 代表所有的方法都暴露 --> < parameter name ="allowedMethods" value ="*" /> < parameter name ="scope" value ="request" /> < responseFlow > < handler type ="RequestHandler" /> </ responseFlow > </ service > </ deployment >
handler元素配置的就是在上面编写的RequestHandler,type就是classpath;里面的parameter和上面RequestHandler中的this.getOption(“state”)的对应。
service元素中的requestFlow handler是请求的时候调用的handler、responsHandler是响应的时候调用的handler。
3、发布当前WebService,和前面的一样运行命令行:
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8080/AxisWebService/services/AdminService deployHandler.wsdd
看到下面的就表示执行成功
Processing file undeploy.wsdd
<Admin>Done processing</Admin>
然后在浏览器中请求:
http://localhost:8080/AxisWebService/servlet/AxisServlet
就可以看到发布的服务,下面编写客户端代码
4、客户端和上面HelloWorldWSDDClient一样,这里就不写了。
调用后可以看到服务器端的控制台输出:
state: success, count: 5, requestCount: 5
state: success, count: 6, requestCount: 6
state: success, count: 7, requestCount: 7
state: success, count: 8, requestCount: 8
why? 为什么是4次?首先请求的时候执行一次handler,响应执行一次。然后调用2个方法,那就响应了2次,所以是4次。可以注销一个方法看看是不是少了2次,state是配置文件中的消息。
本文出自: http://www.cnblogs.com/hoojo/archive/2010/12/20/1911370.html