Limit the times of registry retry. (#2946)
author时无两丶 <442367943@qq.com>
Thu, 13 Dec 2018 09:07:17 +0000 (17:07 +0800)
committerIan Luo <ian.luo@gmail.com>
Thu, 13 Dec 2018 09:07:17 +0000 (17:07 +0800)
The default value is 3.

dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java
dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/retry/AbstractRetryTask.java

index 9265287..c6f8b1f 100644 (file)
@@ -488,11 +488,21 @@ public class Constants {
     public static final String REGISTRY_RETRY_PERIOD_KEY = "retry.period";
 
     /**
+     * Most retry times
+     */
+    public static final String REGISTRY_RETRY_TIMES_KEY = "retry.times";
+
+    /**
      * Default value for the period of retry interval in milliseconds: 5000
      */
     public static final int DEFAULT_REGISTRY_RETRY_PERIOD = 5 * 1000;
 
     /**
+     * Default value for the times of retry: 3
+     */
+    public static final int DEFAULT_REGISTRY_RETRY_TIMES = 3;
+
+    /**
      * Reconnection period in milliseconds for register center
      */
     public static final String REGISTRY_RECONNECT_PERIOD_KEY = "reconnect.period";
index b299b2f..fcbea5f 100644 (file)
@@ -49,12 +49,23 @@ public abstract class AbstractRetryTask implements TimerTask {
     /**
      * retry period
      */
-    protected final long retryPeriod;
+    final long retryPeriod;
+
+    /**
+     * define the most retry times
+     */
+    private final int retryTimes;
 
     /**
      * task name for this task
      */
-    protected final String taskName;
+    private final String taskName;
+
+    /**
+     * times of retry.
+     * retry task is execute in single thread so that the times is not need volatile.
+     */
+    private int times = 1;
 
     private volatile boolean cancel;
 
@@ -67,6 +78,7 @@ public abstract class AbstractRetryTask implements TimerTask {
         this.taskName = taskName;
         cancel = false;
         this.retryPeriod = url.getParameter(Constants.REGISTRY_RETRY_PERIOD_KEY, Constants.DEFAULT_REGISTRY_RETRY_PERIOD);
+        this.retryTimes = url.getParameter(Constants.REGISTRY_RETRY_TIMES_KEY, Constants.DEFAULT_REGISTRY_RETRY_TIMES);
     }
 
     public void cancel() {
@@ -86,7 +98,7 @@ public abstract class AbstractRetryTask implements TimerTask {
         if (timer.isStop() || timeout.isCancelled() || isCancel()) {
             return;
         }
-
+        times++;
         timer.newTimeout(timeout.task(), tick, TimeUnit.MILLISECONDS);
     }
 
@@ -96,6 +108,11 @@ public abstract class AbstractRetryTask implements TimerTask {
             // other thread cancel this timeout or stop the timer.
             return;
         }
+        if (times > retryTimes) {
+            // reach the most times of retry.
+            logger.warn("Final failed to execute task " + taskName + ", url: " + url + ", retry " + retryTimes + " times.");
+            return;
+        }
         if (logger.isInfoEnabled()) {
             logger.info(taskName + " : " + url);
         }