From eb62512faecdce6326fc0b7044f3459339a3177e Mon Sep 17 00:00:00 2001 From: "chao.liuc" Date: Wed, 26 Oct 2011 06:53:37 +0000 Subject: [PATCH] =?UTF-8?q?DUBBO-490=20graceful=20shutdown=20:=E5=BD=93?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E4=B8=AD=E5=BF=83=E5=B0=9A=E6=9C=AA=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=88=B0=E5=AE=A2=E6=88=B7=E7=AB=AF=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E9=87=8D=E8=BF=9E=E6=97=B6=E4=B8=8D=E8=83=BD=E6=8A=A5error?= =?UTF-8?q?=E7=BA=A7=E5=88=AB=E6=97=A5=E5=BF=97=E3=80=82=20=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E8=BF=9E=E6=8E=A5=E6=8A=A5=E9=94=99=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E8=B7=9D=E7=A6=BB=E4=B8=8A=E4=B8=80=E6=AC=A1=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E8=BF=9E=E6=8E=A510=E7=A7=92=E5=86=85=20=E5=88=99warn=20?= =?UTF-8?q?=E5=90=A6=E5=88=99error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/dubbo/trunk@73 1a56cb94-b969-4eaa-88fa-be21384802f2 --- .../com/alibaba/dubbo/common/Constants.java | 2 ++ .../remoting/transport/AbstractClient.java | 30 ++++++++++++++----- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/dubbo-common/src/main/java/com/alibaba/dubbo/common/Constants.java b/dubbo-common/src/main/java/com/alibaba/dubbo/common/Constants.java index 353302b4ce..2440a4a777 100644 --- a/dubbo-common/src/main/java/com/alibaba/dubbo/common/Constants.java +++ b/dubbo-common/src/main/java/com/alibaba/dubbo/common/Constants.java @@ -225,6 +225,8 @@ public class Constants { public static final int DEFAULT_RECONNECT_PERIOD = 2000; + public static final String SHUTDOWN_TIMEOUT_KEY = "shutdown.timeout"; + public static final int DEFAULT_SHUTDOWN_TIMEOUT = 10000; public static final String CHECK_KEY = "check"; diff --git a/dubbo-remoting/src/main/java/com/alibaba/dubbo/remoting/transport/AbstractClient.java b/dubbo-remoting/src/main/java/com/alibaba/dubbo/remoting/transport/AbstractClient.java index a37285dce8..2730acd706 100644 --- a/dubbo-remoting/src/main/java/com/alibaba/dubbo/remoting/transport/AbstractClient.java +++ b/dubbo-remoting/src/main/java/com/alibaba/dubbo/remoting/transport/AbstractClient.java @@ -57,13 +57,20 @@ public abstract class AbstractClient extends AbstractEndpoint implements Client protected volatile ExecutorService executor; - private final boolean send_reconnect ; + private final boolean send_reconnect ; + + //the last successed connected time + private long lastConnectedTime = System.currentTimeMillis(); + + private final int shutdown_timeout ; public AbstractClient(URL url, ChannelHandler handler) throws RemotingException { super(url, handler); - send_reconnect = url.getBooleanParameter(Constants.SEND_RECONNECT_KEY, false); + send_reconnect = url.getBooleanParameter(Constants.SEND_RECONNECT_KEY, false); + + shutdown_timeout = url.getIntParameter(Constants.SHUTDOWN_TIMEOUT_KEY, Constants.DEFAULT_SHUTDOWN_TIMEOUT); try { doOpen(); @@ -103,17 +110,23 @@ public abstract class AbstractClient extends AbstractEndpoint implements Client * init reconnect thread */ private synchronized void initConnectStatusCheckCommand(){ - //如果配置了 reconnect = false 则不尝试重连。 + //reconnect=false to close reconnect int reconnect = getReconnectParam(getUrl()); if(reconnect > 0 && reconnectExecutorFuture == null){ - Runnable connectStatusCheckCommand = new Runnable() { + Runnable connectStatusCheckCommand = new Runnable() { + String errorMsg = "Unexpected error occur at client reconnect"; public void run() { try { if (! isConnected()) { - connect();//定时检查与消息发送时检测都要做。 + connect(); + } + } catch (Throwable t) { + // wait registry sync provider list + if (System.currentTimeMillis() - lastConnectedTime > shutdown_timeout){ + logger.warn(errorMsg, t); + } else { + logger.error(errorMsg, t); } - } catch (Throwable t) { // 防御性容错 - logger.error("Unexpected error occur at client reconnect", t); } } }; @@ -236,7 +249,8 @@ public abstract class AbstractClient extends AbstractEndpoint implements Client throw new RemotingException(this, "Failed connect to server " + getRemoteAddress() + " from " + getClass().getSimpleName() + NetUtils.getLocalHost() + " using dubbo version " + Version.getVersion() + ", cause: Connect wait timeout: " + getTimeout() + "ms."); - } + } + lastConnectedTime = System.currentTimeMillis(); } catch (RemotingException e) { throw e; } catch (Throwable e) {