全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

基于dubbo中Listener的实现方法

这里继续dubbo的源码旅程,在过程中学习它的设计和技巧,看优秀的代码,我想对我们日程编码必然有帮助的。而那些开源的代码正是千锤百炼的东西,希望和各位共勉。

拿ProtocolListenerWrapper为例子,看源码的时候发现它是一个装饰类的标准实现有一个自身的复制构造函数,把被包装者复制进来,然后结合装饰部分的操作。看下ProtocolListenerWrapper类有这样的代码:

public class ProtocolListenerWrapper implements Protocol {

  private final Protocol protocol;

  public ProtocolListenerWrapper(Protocol protocol){
    if (protocol == null) {
      throw new IllegalArgumentException("protocol == null");
    }
    this.protocol = protocol;
  }

  public int getDefaultPort() {
    return protocol.getDefaultPort();
  }

  public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
    if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) {
      return protocol.export(invoker);
    }
    return new ListenerExporterWrapper<T>(protocol.export(invoker),
        Collections.unmodifiableList(ExtensionLoader.getExtensionLoader(ExporterListener.class)
            .getActivateExtension(invoker.getUrl(), Constants.EXPORTER_LISTENER_KEY)));
  }

  public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {
    if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
      return protocol.refer(type, url);
    }
    return new ListenerInvokerWrapper<T>(protocol.refer(type, url),
        Collections.unmodifiableList(
            ExtensionLoader.getExtensionLoader(InvokerListener.class)
            .getActivateExtension(url, Constants.INVOKER_LISTENER_KEY)));
  }

  public void destroy() {
    protocol.destroy();
  }

}

而我们在ExtensionLoader里找到了这份代码片段clazz.getConstructor()方法就是去匹配前面提到的装饰模式用到的方式。

而这些类作为插件会被放入cachedWrapperClasses进行缓存。而对这个缓存的使用就是解开listenter调用实现的钥匙。

try {
  clazz.getConstructor(type);
  Set<Class<?>> wrappers = cachedWrapperClasses;
  if (wrappers == null) {
    cachedWrapperClasses = new ConcurrentHashSet<Class<?>>();
    wrappers = cachedWrapperClasses;
  }
  wrappers.add(clazz);
} catch (NoSuchMethodException e) {

上面也可以看到用一场作为一个判断逻辑。

ExtensionLoader中getExtension(String name)方法中会调用createExtension(String name)这个方法中将cachedWrapperClasses利用了起来,具体实现就是将被装饰类实例作为参数调用warpper类的自身复制构造函数,这样就会把被装饰累包装起来,从而达到,当有调用被装饰类的方法是就可以执行到warpper中的逻辑代码了,实现都是调用了clazz.getConstructor方法,代码片段:

Set<Class<?>> wrapperClasses = cachedWrapperClasses;
if (wrapperClasses != null && wrapperClasses.size() > 0) {
  for (Class<?> wrapperClass : wrapperClasses) {
    instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));
  }
}

再回去看一下ProtocolListenerWrapper,我们可以发现继承Protocol中的export方法是对外开放service的入口方法,它返回exporter,代码中实际是返回了ListenerExporterWrapper,这也是个装饰类,不过没有使用上面提到的机制,只是把exporter和listener进行类包装,在构造函数里将listener执行。至此我们终于找到了执行listener的代码。

在dubbo的开发中listener是及其重要的一个扩展口子,在服务对外时执行一些自己想做的事情就些各类继承ExporterListener

在引用服务的时候想做些自己的事就写个类继承InvokerListener。

另外,ExporterListener为例,发现他的子类中有一个ExporterListenerAdapter,两个空方法,代码:

public abstract class ExporterListenerAdapter implements ExporterListener {

  public void exported(Exporter<?> exporter) throws RpcException {
  }

  public void unexported(Exporter<?> exporter) throws RpcException {
  }

}

这是个技巧吧,刚刚上面提到自己要写扩展类的时候就不直接继承ExporterListener了,因为直接继承接口会强制要求实现两个方法的,而实际编码中dubbo的作者应该也发现这两个方法是完全不同的业务时使用,所有我们可以只继承ExporterListenerAdapter,如此自己的业务代码中就不需要出现一个空方法了。

以上这篇基于dubbo中Listener的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# dubbo中Listener的实现  # 自己的  # 给大家  # 都是  # 找到了  # 是个  # 千锤百炼  # 子类  # 不需要  # 就不  # 中有  # 它是  # 我们可以  # 这也  # 这两个  # 希望能  # 去看  # 这份  # 可以看到  # 将被  # 作为一个 


相关文章: ,石家庄四十八中学官网?  定制建站是什么?如何实现个性化需求?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  网站制作报价单模板图片,小松挖机官方网站报价?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  再谈Python中的字符串与字符编码(推荐)  如何通过虚拟机搭建网站?详细步骤解析  如何用低价快速搭建高质量网站?  如何挑选高效建站主机与优质域名?  详解jQuery停止动画——stop()方法的使用  建站之家VIP精选网站模板与SEO优化教程整合指南  python的本地网站制作,如何创建本地站点?  建站主机默认首页配置指南:核心功能与访问路径优化  ,如何利用word制作宣传手册?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  建站上传速度慢?如何优化加速网站加载效率?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何选择高效稳定的ISP建站解决方案?  浅谈Javascript中的Label语句  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  如何在服务器上三步完成建站并提升流量?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  如何解决ASP生成WAP建站中文乱码问题?  怎么将XML数据可视化 D3.js加载XML  如何通过西部数码建站助手快速创建专业网站?  javascript中的try catch异常捕获机制用法分析  linux top下的 minerd 木马清除方法  建站主机助手选型指南:2025年热门推荐与高效部署技巧  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  股票网站制作软件,网上股票怎么开户?  如何获取上海专业网站定制建站电话?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  免费视频制作网站,更新又快又好的免费电影网站?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  英语简历制作免费网站推荐,如何将简历翻译成英文?  建站之星安装后如何自定义网站颜色与字体?  网站制作公司,橙子建站是合法的吗?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  如何快速生成橙子建站落地页链接?  如何用已有域名快速搭建网站?  如何自定义建站之星模板颜色并下载新样式? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。