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