You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@dubbo.apache.org by "code4wt (GitHub)" <gi...@apache.org> on 2018/11/28 02:15:33 UTC

[GitHub] [incubator-dubbo] code4wt commented on issue #2837: InjvmProtocol isInjvmRefer 方法是不是有bug?

不算bug,只是逻辑上让人有点奇怪。当协议头为 injvm 时,Protocol 自适应拓展类会自动根据协议头加载指定的 Protocol 实现类。比如协议头为 injvm,就去加载 InjvmProtocol。自适应拓展类代码如下:

```java
public class Protocol$Adaptive implements com.alibaba.dubbo.rpc.Protocol {

    // 省略一部分代码

    public com.alibaba.dubbo.rpc.Invoker refer(java.lang.Class arg0, com.alibaba.dubbo.common.URL arg1)
        throws com.alibaba.dubbo.rpc.RpcException {
        if (arg1 == null) {
            throw new IllegalArgumentException("url == null");
        }
        com.alibaba.dubbo.common.URL url = arg1;
        // 获取协议头,默认为 dubbo
        String extName = (url.getProtocol() == null ? "dubbo" : url.getProtocol());
        if (extName == null) {
            throw new IllegalStateException(
                "Fail to get extension(com.alibaba.dubbo.rpc.Protocol) name from url(" + url.toString()
                    + ") use keys([protocol])");
        }

        // 通过 SPI 加载指定的 Protocol,比如 extName = injvm 时,就去加载 InjvmProtocol
        com.alibaba.dubbo.rpc.Protocol extension = (com.alibaba.dubbo.rpc.Protocol) ExtensionLoader
            .getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class).getExtension(extName);
        return extension.refer(arg0, arg1);
    }
}
```

[ Full content available at: https://github.com/apache/incubator-dubbo/issues/2837 ]
This message was relayed via gitbox.apache.org for notifications@dubbo.apache.org