xfire client Retrying request

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);


猜你喜欢

转载自blog.csdn.net/xiazou/article/details/56281238