This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/master by this push:
     new e8d645b  Merge pull request #3566, optimize compareTo of Router to 
guarantee consistent behaviour.
e8d645b is described below

commit e8d645b254c5fe8d786000473d62a5dcc2bebddc
Author: xujingfeng <250577...@qq.com>
AuthorDate: Mon Mar 4 14:58:49 2019 +0800

    Merge pull request #3566, optimize compareTo of Router to guarantee 
consistent behaviour.
---
 .../main/java/org/apache/dubbo/rpc/cluster/Router.java    | 15 ++++-----------
 .../apache/dubbo/rpc/cluster/router/AbstractRouter.java   |  2 +-
 .../rpc/cluster/router/condition/ConditionRouter.java     |  3 +--
 .../rpc/cluster/router/condition/config/AppRouter.java    |  5 +++++
 .../cluster/router/condition/config/ListenableRouter.java |  2 +-
 .../cluster/router/condition/config/ServiceRouter.java    |  5 +++++
 .../rpc/cluster/router/mock/MockInvokersSelector.java     | 11 +++++------
 .../dubbo/rpc/cluster/router/script/ScriptRouter.java     | 12 ++----------
 .../apache/dubbo/rpc/cluster/router/tag/TagRouter.java    | 11 +++--------
 9 files changed, 27 insertions(+), 39 deletions(-)

diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Router.java 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Router.java
index 70fd8fa..fadefde 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Router.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Router.java
@@ -32,6 +32,9 @@ import java.util.List;
  * @see org.apache.dubbo.rpc.cluster.Directory#list(Invocation)
  */
 public interface Router extends Comparable<Router> {
+
+    int DEFAULT_PRIORITY = Integer.MAX_VALUE;
+
     /**
      * Get the router url.
      *
@@ -91,16 +94,6 @@ public interface Router extends Comparable<Router> {
         if (o == null) {
             throw new IllegalArgumentException();
         }
-        if (this.getPriority() == o.getPriority()) {
-            if (o.getUrl() == null) {
-                return 1;
-            }
-            if (getUrl() == null) {
-                return -1;
-            }
-            return 
getUrl().toFullString().compareTo(o.getUrl().toFullString());
-        } else {
-            return getPriority() > o.getPriority() ? 1 : -1;
-        }
+        return Integer.compare(this.getPriority(), o.getPriority());
     }
 }
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouter.java
index f826dae..657ad86 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouter.java
@@ -21,7 +21,7 @@ import org.apache.dubbo.configcenter.DynamicConfiguration;
 import org.apache.dubbo.rpc.cluster.Router;
 
 public abstract class AbstractRouter implements Router {
-    protected int priority;
+    protected int priority = DEFAULT_PRIORITY;
     protected boolean force = false;
     protected URL url;
 
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/ConditionRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/ConditionRouter.java
index 844b1b8..6549cda 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/ConditionRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/ConditionRouter.java
@@ -27,7 +27,6 @@ import org.apache.dubbo.common.utils.UrlUtils;
 import org.apache.dubbo.rpc.Invocation;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.RpcException;
-import org.apache.dubbo.rpc.cluster.Router;
 import org.apache.dubbo.rpc.cluster.router.AbstractRouter;
 
 import java.text.ParseException;
@@ -44,7 +43,7 @@ import java.util.regex.Pattern;
  * ConditionRouter
  *
  */
-public class ConditionRouter extends AbstractRouter implements 
Comparable<Router> {
+public class ConditionRouter extends AbstractRouter {
     public static final String NAME = "condition";
 
     private static final Logger logger = 
LoggerFactory.getLogger(ConditionRouter.class);
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouter.java
index 9c723df..31a5df1 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouter.java
@@ -25,8 +25,13 @@ import org.apache.dubbo.configcenter.DynamicConfiguration;
  */
 public class AppRouter extends ListenableRouter {
     public static final String NAME = "APP_ROUTER";
+    /**
+     * AppRouter should after ServiceRouter
+     */
+    private static final int APP_ROUTER_DEFAULT_PRIORITY = 150;
 
     public AppRouter(DynamicConfiguration configuration, URL url) {
         super(configuration, url, url.getParameter(Constants.APPLICATION_KEY));
+        this.priority = APP_ROUTER_DEFAULT_PRIORITY;
     }
 }
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ListenableRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ListenableRouter.java
index 65a4eec..913fd55 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ListenableRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ListenableRouter.java
@@ -44,7 +44,7 @@ import java.util.stream.Collectors;
 public abstract class ListenableRouter extends AbstractRouter implements 
ConfigurationListener {
     public static final String NAME = "LISTENABLE_ROUTER";
     private static final String RULE_SUFFIX = ".condition-router";
-    public static final int DEFAULT_PRIORITY = 200;
+
     private static final Logger logger = 
LoggerFactory.getLogger(ListenableRouter.class);
     private ConditionRouterRule routerRule;
     private List<ConditionRouter> conditionRouters = Collections.emptyList();
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ServiceRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ServiceRouter.java
index c76f2a7..ed3748e 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ServiceRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ServiceRouter.java
@@ -24,8 +24,13 @@ import org.apache.dubbo.configcenter.DynamicConfiguration;
  */
 public class ServiceRouter extends ListenableRouter {
     public static final String NAME = "SERVICE_ROUTER";
+    /**
+     * ServiceRouter should before AppRouter
+     */
+    private static final int SERVICE_ROUTER_DEFAULT_PRIORITY = 140;
 
     public ServiceRouter(DynamicConfiguration configuration, URL url) {
         super(configuration, url, url.getEncodedServiceKey());
+        this.priority = SERVICE_ROUTER_DEFAULT_PRIORITY;
     }
 }
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mock/MockInvokersSelector.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mock/MockInvokersSelector.java
index d6961d6..78ada66 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mock/MockInvokersSelector.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mock/MockInvokersSelector.java
@@ -30,11 +30,15 @@ import java.util.List;
 /**
  * A specific Router designed to realize mock feature.
  * If a request is configured to use mock, then this router guarantees that 
only the invokers with protocol MOCK appear in final the invoker list, all 
other invokers will be excluded.
- *
  */
 public class MockInvokersSelector extends AbstractRouter {
 
     public static final String NAME = "MOCK_ROUTER";
+    private static final int MOCK_INVOKERS_DEFAULT_PRIORITY = 
Integer.MIN_VALUE;
+
+    public MockInvokersSelector() {
+        this.priority = MOCK_INVOKERS_DEFAULT_PRIORITY;
+    }
 
     @Override
     public <T> List<Invoker<T>> route(final List<Invoker<T>> invokers,
@@ -94,9 +98,4 @@ public class MockInvokersSelector extends AbstractRouter {
         return hasMockProvider;
     }
 
-    @Override
-    public int getPriority() {
-        return Integer.MAX_VALUE;
-    }
-
 }
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptRouter.java
index b7f3587..0b47d2e 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptRouter.java
@@ -25,7 +25,6 @@ import org.apache.dubbo.rpc.Invocation;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.RpcContext;
 import org.apache.dubbo.rpc.RpcException;
-import org.apache.dubbo.rpc.cluster.Router;
 import org.apache.dubbo.rpc.cluster.router.AbstractRouter;
 
 import javax.script.Bindings;
@@ -46,6 +45,7 @@ import java.util.stream.Collectors;
  */
 public class ScriptRouter extends AbstractRouter {
     public static final String NAME = "SCRIPT_ROUTER";
+    private static final int SCRIPT_ROUTER_DEFAULT_PRIORITY = 0;
     private static final Logger logger = 
LoggerFactory.getLogger(ScriptRouter.class);
 
     private static final Map<String, ScriptEngine> engines = new 
ConcurrentHashMap<>();
@@ -58,7 +58,7 @@ public class ScriptRouter extends AbstractRouter {
 
     public ScriptRouter(URL url) {
         this.url = url;
-        this.priority = url.getParameter(Constants.PRIORITY_KEY, 0);
+        this.priority = url.getParameter(Constants.PRIORITY_KEY, 
SCRIPT_ROUTER_DEFAULT_PRIORITY);
 
         engine = getEngine(url);
         rule = getRule(url);
@@ -150,12 +150,4 @@ public class ScriptRouter extends AbstractRouter {
         return url.getParameter(Constants.FORCE_KEY, false);
     }
 
-    @Override
-    public int compareTo(Router o) {
-        if (o == null || o.getClass() != ScriptRouter.class) {
-            return 1;
-        }
-        ScriptRouter c = (ScriptRouter) o;
-        return this.priority == c.priority ? rule.compareTo(c.rule) : 
(this.priority > c.priority ? 1 : -1);
-    }
 }
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
index c8e8750..3150c29 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
@@ -29,7 +29,6 @@ import org.apache.dubbo.configcenter.DynamicConfiguration;
 import org.apache.dubbo.rpc.Invocation;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.RpcException;
-import org.apache.dubbo.rpc.cluster.Router;
 import org.apache.dubbo.rpc.cluster.router.AbstractRouter;
 import org.apache.dubbo.rpc.cluster.router.tag.model.TagRouterRule;
 import org.apache.dubbo.rpc.cluster.router.tag.model.TagRuleParser;
@@ -44,9 +43,9 @@ import static org.apache.dubbo.common.Constants.TAG_KEY;
 /**
  * TagRouter, "application.tag-router"
  */
-public class TagRouter extends AbstractRouter implements Comparable<Router>, 
ConfigurationListener {
+public class TagRouter extends AbstractRouter implements ConfigurationListener 
{
     public static final String NAME = "TAG_ROUTER";
-    private static final int DEFAULT_PRIORITY = 100;
+    private static final int TAG_ROUTER_DEFAULT_PRIORITY = 100;
     private static final Logger logger = 
LoggerFactory.getLogger(TagRouter.class);
     private static final String RULE_SUFFIX = ".tag-router";
 
@@ -55,6 +54,7 @@ public class TagRouter extends AbstractRouter implements 
Comparable<Router>, Con
 
     public TagRouter(DynamicConfiguration configuration, URL url) {
         super(configuration, url);
+        this.priority = TAG_ROUTER_DEFAULT_PRIORITY;
     }
 
     @Override
@@ -173,11 +173,6 @@ public class TagRouter extends AbstractRouter implements 
Comparable<Router>, Con
     }
 
     @Override
-    public int getPriority() {
-        return DEFAULT_PRIORITY;
-    }
-
-    @Override
     public boolean isRuntime() {
         return tagRouterRule != null && tagRouterRule.isRuntime();
     }

Reply via email to