xfire client调用的时候,连接超时时,会自动重试,尝试三次连接
DEBUG o.a.c.httpclient.HttpMethodDirector - Connection timed out: connect
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.6.0_43]
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) ~[na:1.6.0_43]
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) ~[na:1.6.0_43]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) ~[na:1.6.0_43]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) ~[na:1.6.0_43]
at java.net.Socket.connect(Socket.java:529) ~[na:1.6.0_43]
at java.net.Socket.connect(Socket.java:478) ~[na:1.6.0_43]
at java.net.Socket.<init>(Socket.java:375) ~[na:1.6.0_43]
at java.net.Socket.<init>(Socket.java:249) ~[na:1.6.0_43]
at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:80) ~[commons-httpclient-3.1.jar:na]
at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:122) ~[commons-httpclient-3.1.jar:na]
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707) ~[commons-httpclient-3.1.jar:na]
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361) ~[commons-httpclient-3.1.jar:na]
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387) [commons-httpclient-3.1.jar:na]
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) [commons-httpclient-3.1.jar:na]
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) [commons-httpclient-3.1.jar:na]
at org.codehaus.xfire.transport.http.CommonsHttpMessageSender.send(CommonsHttpMessageSender.java:369) [xfire-all-1.2.6.jar:na]
at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:123) [xfire-all-1.2.6.jar:na]
at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48) [xfire-all-1.2.6.jar:na]
at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26) [xfire-all-1.2.6.jar:na]
at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131) [xfire-all-1.2.6.jar:na]
at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79) [xfire-all-1.2.6.jar:na]
at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114) [xfire-all-1.2.6.jar:na]
at org.codehaus.xfire.client.Client.invoke(Client.java:336) [xfire-all-1.2.6.jar:na]
at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77) [xfire-all-1.2.6.jar:na]
at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57) [xfire-all-1.2.6.jar:na]
at com.sun.proxy.$Proxy67.queryByExpression(Unknown Source) [na:na]
……
INFO o.a.c.httpclient.HttpMethodDirector - Retrying request
在调用时,程序本身也做了重试操作,所以appache httpClient的重试就不需要了
处理方法一,修改源码:
org.codehaus.xfire.transport.http下CommonsHttpMessageSender的open()方法,最下面增加
// 设置重试次数
String s = (String) context.getContextualProperty(HTTP_CONNECT_RETRYTIMES);
if (null != s && 0 < s.length()) {
HttpMethodRetryHandler retryHandler = new DefaultHttpMethodRetryHandler(Integer.parseInt(s), false);
postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, retryHandler);
}
客户端调用:
// 调用对方服务
UserServicePortType portType = new UserServiceClient().getUserServiceHttpPort(csys.getUserServiceUrl());
Client client = org.codehaus.xfire.client.Client.getInstance(portType);
client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, "10000"); // 超时
client.setProperty(CommonsHttpMessageSender.HTTP_CONNECT_RETRYTIMES, "0");
方法二,设置 HttpClientParams参数:
// 调用对方服务
UserServicePortType portType = new UserServiceClient().getUserServiceHttpPort(csys.getUserServiceUrl());
Client client = org.codehaus.xfire.client.Client.getInstance(portType);
// client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, timeout); // 超时
org.apache.commons.httpclient.params.HttpClientParams params = new org.apache.commons.httpclient.params.HttpClientParams();
params.setParameter(HttpClientParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(0, false));
params.setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, new Long(timeout));
client.setProperty(CommonsHttpMessageSender.HTTP_CLIENT_PARAMS, params);