返回顶部
首页 > 资讯 > 精选 >Listener如何在dubbo中实现
  • 758
分享到

Listener如何在dubbo中实现

dubbolistenerlis 2023-05-31 08:05:20 758人浏览 薄情痞子
摘要

本篇文章给大家分享的是有关Listener如何在dubbo中实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。拿ProtocolListenerWrapper为例子,看源码的时

本篇文章给大家分享的是有关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,如此自己的业务代码中就不需要出现一个空方法了。

以上就是Listener如何在dubbo中实现,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: Listener如何在dubbo中实现

本文链接: https://lsjlt.com/news/224275.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Listener如何在dubbo中实现
    本篇文章给大家分享的是有关Listener如何在dubbo中实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。拿ProtocolListenerWrapper为例子,看源码的时...
    99+
    2023-05-31
    dubbo listener lis
  • Netty-在-Dubbo-中如何应用
    前言众所周知,国内知名框架 Dubbo 底层使用的是 Netty 作为网络通信,那么内部到底是如何使用的呢?今天我们就来一探究竟。 dubbo 的 Consumer 消费者如何使用 Netty注意:此次代码使用了从 github 上 clo...
    99+
    2023-06-05
  • 使用spring-boot如何实现整合dubbo中的Spring-boot-dubbo-starter
    使用spring-boot如何实现整合dubbo中的Spring-boot-dubbo-starter?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在application.p...
    99+
    2023-05-31
    springboot art dubbo
  • oracle中的listener如何配置
    在Oracle数据库中,Listener是一个运行在服务端的进程,用于处理客户端请求。要配置Listener,可以按照以下步骤进行:...
    99+
    2024-04-09
    oracle
  • Apache Dubbo的SPI机制是如何实现的
    目录一、SPI1.1 JDK自带SPI实现 1.2 Dubbo SPI 二、加载-ExtensionLoader 2.1 获取ExtensionLoader的实例 2.2 加载扩展类...
    99+
    2024-04-02
  • Springboot如何整合Dubbo/ZooKeeper实现SOA案例
    这篇文章给大家分享的是有关Springboot如何整合Dubbo/ZooKeeper实现SOA案例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、为啥整合 Dubbo 实现 SOADubbo 不单单只是高性能的...
    99+
    2023-05-30
    springboot dubbo soa
  • 如何在Spring与Spring Boot项目中使用Dubbo
    这篇文章给大家介绍如何在Spring与Spring Boot项目中使用Dubbo,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、在Spring中使用Dubbo1、Maven依赖<dependency>&n...
    99+
    2023-05-30
    spring spring boot dubbo
  • Dubbo中@DubboReference.version如何设置为*
    Dubbo中@DubboReference.version如何设置为*,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Dubbo在消费端提供...
    99+
    2024-04-02
  • SpringBoot中如何整合Dubbo zookeeper
    本篇内容介绍了“SpringBoot中如何整合Dubbo zookeeper”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!docker pu...
    99+
    2023-06-08
  • springBoot+dubbo+zookeeper如何实现分布式开发应用
    小编给大家分享一下springBoot+dubbo+zookeeper如何实现分布式开发应用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!环境搭建项目结构图:1.我们首先做好服务端pom.xml  &n...
    99+
    2023-06-29
  • dubbo如何实现consumer从多个group中调用指定group的provider
    目录背景过程为什么必须缓存那么多consumerconsumer只能调用一个group的provider么group="*"能代替Map<String, I...
    99+
    2023-03-21
    dubbo调用 dubbo consumer dubbo调用指定group的provider
  • dubbo-go 中的 TPS Limit 设计与实现
    前言...
    99+
    2024-04-02
  • jsonrpc如何在python中实现
    这篇文章将为大家详细讲解有关jsonrpc如何在python中实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WE...
    99+
    2023-06-14
  • 如何在MyBatis中实现DataSource
    目录一、DataSource二、DataSourceFactory三、UnpooledDataSource四、PooledDataSource一、DataSource 首先大家要清楚...
    99+
    2024-04-02
  • 如何在iis中实现ssl
    要在IIS中实现SSL,您需要完成以下步骤:1. 获取SSL证书:您可以从一个可信的证书颁发机构(CA)购买SSL证书,或者使用自签...
    99+
    2023-08-25
    iis ssl
  • 如何在 Go 中实现 CryptoJS.AES.decrypt
    问题内容 我使用 JavaScript 中的 CryptoJS 使用给定密钥进行“简单”AES 解密 var CryptoJS = require('crypto-js'); let...
    99+
    2024-02-05
  • 如何在Keras中实现GAN
    在Keras中实现GAN可以通过以下步骤完成: 定义生成器模型:创建一个生成器模型,通常是一个包含几个全连接层或卷积层的神经网络...
    99+
    2024-03-14
    Keras
  • Dubbo中的URL统一模型怎么实现
    这篇文章主要介绍“Dubbo中的URL统一模型怎么实现”,在日常操作中,相信很多人在Dubbo中的URL统一模型怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Dubbo中的URL统一模型怎么实现”的疑...
    99+
    2023-06-04
  • 如何在 Django 中实现实时 shell?
    Django 是一个广泛使用的 Python Web 框架,许多开发者使用 Django 来快速构建高质量的 Web 应用程序。在 Django 中,我们可以使用 Django shell 来与应用程序进行交互,但是默认情况下,Django...
    99+
    2023-07-08
    django 实时 shell
  • 使用Spring Boot如何实现对Dubbo框架进行集成
    这期内容当中小编将会给大家带来有关使用Spring Boot如何实现对Dubbo框架进行集成,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.创建工程在pom.xml中加入依赖创建工程名为:(1)spri...
    99+
    2023-05-31
    springboot dubbo
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作