Java SE6中实现了JSR223。这样在脚本代码中就可以访问java对象和方法。内部的机制感觉应该是首先翻译成java代码,然后再执行。并不是集成了类似于v8这样的脚本引擎。
这里dubbo的官网提供了一个例子,多像java代码,只不过没有静态类型声明罢了。
function route(invokers) {
var result = new java.util.ArrayList(invokers.size());
for (i = 0; i < invokers.size(); i ++) {
if ("http://10.20.160.198/wiki/display/dubbo/10.20.153.10".equals(invokers.get(i).getUrl().getHost())) {
result.add(invokers.get(i));
}
}
return result;
} (invokers); // 表示立即执行方法
ScriptRouter中的逻辑:编译,通过binding把参数传到函数形参中,然后通过eval来拿到函数执行的结果。
public <T> List<Invoker<T>> route(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException {
// ...
List<Invoker<T>> invokersCopy = new ArrayList<Invoker<T>>(invokers);
Compilable compilable = (Compilable) engine;
Bindings bindings = engine.createBindings();
bindings.put("invokers", invokersCopy);
bindings.put("invocation", invocation);
bindings.put("context", RpcContext.getContext());
CompiledScript function = compilable.compile(rule);
Object obj = function.eval(bindings);
return ....;
// ...
}
脚本特别适合的一个应用场景,定义规则。