zoukankan      html  css  js  c++  java
  • 四、handler的作用及特性

    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.csdn.net/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是配置文件中的消息。

  • 作者:hoojo
    出处:
    blog:http://blog.csdn.net/IBM_hoojo
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权所有,转载请注明出处 本文出自:
分享道版权所有,欢迎转载,转载请注明出处,谢谢
收藏
关注
评论
查看全文
  • 相关阅读:
    Hibernate Validation注解列表
    Java_Shell多线程
    Lua读写文件
    shell导出和导入redis
    大文件读写
    Java_Hbase优化
    控制语句if
    字典(DICT)
    元组Tuple
    Session 会话
  • 原文地址:https://www.cnblogs.com/hoojo/p/1911370.html
  • Copyright © 2011-2022 走看看