java客户端调用webservice 超时问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java客户端调用webservice 超时问题相关的知识,希望对你有一定的参考价值。
在action调用了webservice的一个接口,希望能超过20秒,我们就在页面上提示接口返回超时,但在20秒内只要接口有返回,接口马上停止等待向下执行,请问这要怎么写代码才好呢?客户端代码如下:String address = "http://localhost:8080/axis2spring/services/WeatherService"; EndpointReference target = new EndpointReference(address); RPCServiceClient serviceClient = new RPCServiceClient(); Options options = serviceClient.getOptions(); options.setTo(target); QName opGetWeather = new QName("http://service","getWeather"); Object[] opGetWeatherArgs = new Object[]; Class[] returnType = new Class[]Weather.class; Object[] response = serviceClient.invokeBlocking(opGetWeather, opGetWeatherArgs, returnType); Weather ret = (Weather) response[0]; if(ret == null) System.out.println(" has no record"); else System.out.println("Temperature: " + ret.getTemperature()); (答案有帮助的话,再加分)
参考技术A 用多线程来处理类似问题将调用这个WebService的程序放到一个独立线程A中,再创建另一个线程B用来计时,线程A和线程B共享一个变量responseOK。
在线程A中调用WebService之前启动线程B,成功返回后设定responseOK=true。
线程B启动后计时,如果responseOK==true则停止计时,如果计时超过20秒,则终止线程A并返回错误信息。
似乎webService调用的时候如果服务端超时应该会有异常触发的,截获此异常即可。
webservice超时设置
参考技术A package com.primeton.mq.test;importcom.primeton.mq.service.DemoService;
importorg.apache.cxf.endpoint.Client;
importorg.apache.cxf.jaxws.JaxWsProxyFactoryBean;
importorg.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
importorg.apache.cxf.transport.http.HTTPConduit;
importorg.apache.cxf.transports.http.configuration.HTTPClientPolicy;
publicclassdemo
publicstaticvoid main(String[] args)
//创建动态客户端
JaxWsDynamicClientFactoryfactory =JaxWsDynamicClientFactory.newInstance();
Clientclient = factory.createClient("http://localhost:8090/demo/api?wsdl");
// 需要密码的情况需要加上用户名和密码
//client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD));
HTTPConduitconduit = (HTTPConduit) client.getConduit();
HTTPClientPolicyhttpClientPolicy = newHTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(2000);//连接超时
httpClientPolicy.setAllowChunking(false);//取消块编码
httpClientPolicy.setReceiveTimeout(120000);//响应超时
conduit.setClient(httpClientPolicy);
//client.getOutInterceptors().addAll(interceptors);//设置拦截器
try
Object[] objects = newObject[0];
// invoke("方法名",参数1,参数2,参数3....);
objects = client.invoke("sayHello","sujin");
System.out.println("返回数据:"+ objects[0]);
catch(Exceptione)
e.printStackTrace();
以上是关于java客户端调用webservice 超时问题的主要内容,如果未能解决你的问题,请参考以下文章
java axis2 调用webservice 怎么捕获超时异常(即超时了让它停下来,不要报错)
axis2 调用 webService 报超时错误 org.apache.axis2.AxisFault: Connection reset