webservice 高级应用之Handler的使用

本文介绍了一种在客户端全局设置Webservice调用超时时间的方法,通过编写自定义Handler并配置client-config.wsdd文件实现对所有Webservice调用的统一超时管理。

 

 

客户端Handler的使用:


webservice 超时的问题,在代码级别可以

Service service = new Service();
Call call = (Call)service.createCall();
call.setTimeout(5000);

不过要是在项目中有
1:使用的这种方式调用webservice
2:有人使用的是使用wsdl地址直接生成的本地框架完成客户端得调用
3:MessageFactory messageFactory=MessageFactory.newInstance();
                        SOAPMessage reqMsg = messageFactory.createMessage();
发送soap消息的方式

那么你在代码里显示的调用设置的超时的方法 就是一个侵入式的设计,并不是所有的开发人员都会设置超时,
由于项目中使用的是axis的 webservice 框架,我们可以使用客户端得Handler

axis 当初的设计就给客户端和服务器留下了充足的余地,配置服务器端的Handler配置在 server-config.wsdd文件中,而客户端得Handler 就配置在 client-config.wsdd 文件中(在axis包中的org.apache.axis.client 下),下面我们配置客户端的Handler ,在这个handler 中我们只设置一个超时时间,项目中所有应用的webservice所有的客户端的调用都会被这个handler 截获,从而统一设置超时时间。

 

 

步骤:

 

1. 编写客户端Handler 处理类,继承BaseHandler

 

package cn.com.xinli.netb.ejb.wsdl;

import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
import org.apache.log4j.Logger;
/**
 * 
 * webserice 超时处理器,网厅所有的webservice接口都会被这个Handler截获
 * 超时处理器的超时时间从配置文件client-config.wsdd中读取
 *
 * @author Owner
 *
 */
public class WebServiceHandler extends BasicHandler 
{
	Logger log=Logger.getLogger(WebServiceHandler.class);
	public void invoke(MessageContext messageContext) throws AxisFault
	{
		
		String timeout=(String)this.getOption("timeout");
		if("".equals(timeout)||timeout==null )
		{
			timeout="60000";
		}
		/*设置webservice客户端调用的超时时间是60秒
		 * 这个设置会覆盖 你显示的调用 call.setTimeOut();
		 * */
		log.info("webservice 超时过滤器被调用,默认的超时时间是"+timeout+"毫秒");
		messageContext.setTimeout(Integer.parseInt(timeout));
	}

}

 

 

步骤2:客户端配置文件 放在src下

 

<?xml version="1.0" encoding="UTF-8"?>
<deployment name="defaultClientConfig"
            xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <globalConfiguration>
 <!-- webservice 客户端超时处理器,默认超时时间为60秒 -->
  <requestFlow>
            <handler name="TimeOutControl" type="java:cn.com.xinli.netb.ejb.wsdl.WebServiceHandler">
                <parameter name="timeout" value="60000"/>
            </handler>
 </requestFlow>
   <parameter name="disablePrettyXML" value="true"/>
   <parameter name="enableNamespacePrefixOptimization" value="false"/>
 </globalConfiguration>
 <transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/>
 <transport name="local" pivot="java:org.apache.axis.transport.local.LocalSender"/>
 <transport name="java" pivot="java:org.apache.axis.transport.java.JavaSender"/>
</deployment>

 

编译运行,当系统调用其他系统的webservice 服务器端得时候:

 

485  [main] INFO  cn.com.xinli.WebServiceHandler(29) - webservice 超时过滤器被调用,默认的超时时间是60000毫秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值