java调用webservice服务org.apache.axis2.AxisFault: Read timed out问题

shihp 2016-05-09 05:04:40
环境:
1、服务端aix 1.4的webservice,可用域名或ip访问,访问的客户端必须在服务器上注册,注册分配给客户端权限串且绑定IP
2、调用webservice服务的客户端代码是用axis2 1.6写的,客户端程序部署在11台服务器上(10台linux、1台windows 2008),使用客户端的程序是一个独立运行的socketserver程序,每个客户端都是在服务器上注册的,未经注册的不能访问。
3、服务器每天有两个时间段不能正常提供服务,会出现调用超时或失败的情况,但其它时间服务器可以正常工作的。
4、客户端设置的超时等待时长,小于服务器返回数据的最大时长,即:服务器保证30秒内返回数据,但客户端的超时时长小于30秒,如20秒。
现象:
现在是有的客户端调用时正常,数据能正常返回,成功率近100%,且延时在几秒内,但有的客户端调用经常调用超时或完全超时,经常不成功的成功率在50%左右,且只是在某一时间段内,过了这一时间段就全正常了。
尤其是完全不成功的,即使重启客户端服务器也不管用。
捕获的异常:
org.apache.axis2.AxisFault: Read timed out
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:197)
at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:404)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:231)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:443)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:406)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:555)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:531)
at org.apache.axis2.rpc.client.RPCServiceClient.invokeBlocking(RPCServiceClient.java:102)
at jserver.operation.InterQueryDriver2046.callInterN(InterQueryDriver2046.java:110)
at jserver.QueryThread.run(QueryThread.java:670)
at jserver.ThreadPool$Worker.run(ThreadPool.java:114)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78)
at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106)
at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.readLine(MultiThreadedHttpConnectionManager.java:1413)
at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973)
at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735)
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1098)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:621)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:193)
... 13 more

客户端调用代码
try {  
String url = interurl;
serviceClient = new RPCServiceClient();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(url);
Options options = serviceClient.getOptions();
//确定目标服务地址
options.setTo(targetEPR);
options.setManageSession(true);
options.setProperty(HTTPConstants.REUSE_HTTP_CLIENT,false);
//确定调用方法
//options.setAction("urn:getPrice");
options.setAction(ReadConf.interRead);
options.setTimeOutInMilliSeconds(20000);
QName qname = new QName("http://quickstart.samples/xsd", interMethod);
Object[] parameters = new Object[] {paramData1,paramData2,paramData3,reqXML };
Class[] returnTypes = new Class[] { String.class };
Object[] response = serviceClient.invokeBlocking(qname, parameters, returnTypes);
String r = (String) response[0];
serviceClient.cleanupTransport();
serviceClient.cleanup();
serviceClient=null;
} catch (Exception e) {
respXML="<?xml version=\"1.0\" encoding=\"GBK\"?><root><head><code>-1</code><message>数据查询接口调用失败!</message></head></root>";
ErrorLog.writeInterLog(e);

} finally{
if(serviceClient!=null){
try{
serviceClient.cleanupTransport();
serviceClient.cleanup();
serviceClient=null;
}catch(Exception e){
e.printStackTrace();
}
}
}
...全文
1683 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
shihp 2016-08-08
  • 打赏
  • 举报
回复
虽然不只是我这一方调用,但并发量应该不大,最多也就向十,我估计在50以内。前段时间,服务方增加了两台服务器,现在好多了,只是偶尔会出现一两次,属于个别现象,可以忽略了。谢谢
shihp 2016-08-08
  • 打赏
  • 举报
回复
这两个时间段,具体做什么,服务方未告知,只说有这两个时间段。
家里敷泥呀 2016-05-10
  • 打赏
  • 举报
回复
有统计并发量吗? 3、服务器每天有两个时间段不能正常提供服务 这个的两个时间段,是不是高峰期? 如果是的话,很大程度上是网络问题,需要增加网络资源。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧