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 74ef98bd38b..b7f35873d27 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 @@ -54,12 +54,23 @@ public class ScriptRouter extends AbstractRouter { private final String rule; + private CompiledScript function; + public ScriptRouter(URL url) { this.url = url; this.priority = url.getParameter(Constants.PRIORITY_KEY, 0); - + engine = getEngine(url); rule = getRule(url); + try { + Compilable compilable = (Compilable) engine; + function = compilable.compile(rule); + } catch (ScriptException e) { + logger.error("route error, rule has been ignored. rule: " + rule + + ", url: " + RpcContext.getContext().getUrl(), e); + } + + } /** @@ -72,13 +83,13 @@ private String getRule(URL url) { } return vRule; } - + /** * create ScriptEngine instance by type from url parameters, then cache it */ private ScriptEngine getEngine(URL url) { String type = url.getParameter(Constants.TYPE_KEY, Constants.DEFAULT_SCRIPT_TYPE_KEY); - + return engines.computeIfAbsent(type, t -> { ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName(type); if (scriptEngine == null) { @@ -92,8 +103,9 @@ private ScriptEngine getEngine(URL url) { public List> route(List> invokers, URL url, Invocation invocation) throws RpcException { try { Bindings bindings = createBindings(invokers, invocation); - Compilable compilable = (Compilable) engine; - CompiledScript function = compilable.compile(rule); + if (function == null) { + return invokers; + } return getRoutedInvokers(function.eval(bindings)); } catch (ScriptException e) { logger.error("route error, rule has been ignored. rule: " + rule + ", method:" +