真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Listener如何在dubbo中實現(xiàn)-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關(guān)Listener如何在dubbo中實現(xiàn),小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)公司致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營銷,提供做網(wǎng)站、網(wǎng)站制作、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營銷、微信小程序開發(fā)、公眾號商城、等建站開發(fā),創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢。

拿ProtocolListenerWrapper為例子,看源碼的時候發(fā)現(xiàn)它是一個裝飾類的標(biāo)準(zhǔn)實現(xiàn)有一個自身的復(fù)制構(gòu)造函數(shù),把被包裝者復(fù)制進(jìn)來,然后結(jié)合裝飾部分的操作。看下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  Exporter export(Invoker invoker) throws RpcException {
    if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) {
      return protocol.export(invoker);
    }
    return new ListenerExporterWrapper(protocol.export(invoker),
        Collections.unmodifiableList(ExtensionLoader.getExtensionLoader(ExporterListener.class)
            .getActivateExtension(invoker.getUrl(), Constants.EXPORTER_LISTENER_KEY)));
  }

  public  Invoker refer(Class type, URL url) throws RpcException {
    if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
      return protocol.refer(type, url);
    }
    return new ListenerInvokerWrapper(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進(jìn)行緩存。而對這個緩存的使用就是解開listenter調(diào)用實現(xiàn)的鑰匙。

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

上面也可以看到用一場作為一個判斷邏輯。

ExtensionLoader中g(shù)etExtension(String name)方法中會調(diào)用createExtension(String name)這個方法中將cachedWrapperClasses利用了起來,具體實現(xiàn)就是將被裝飾類實例作為參數(shù)調(diào)用warpper類的自身復(fù)制構(gòu)造函數(shù),這樣就會把被裝飾累包裝起來,從而達(dá)到,當(dāng)有調(diào)用被裝飾類的方法是就可以執(zhí)行到warpper中的邏輯代碼了,實現(xiàn)都是調(diào)用了clazz.getConstructor方法,代碼片段:

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

再回去看一下ProtocolListenerWrapper,我們可以發(fā)現(xiàn)繼承Protocol中的export方法是對外開放service的入口方法,它返回exporter,代碼中實際是返回了ListenerExporterWrapper,這也是個裝飾類,不過沒有使用上面提到的機(jī)制,只是把exporter和listener進(jìn)行類包裝,在構(gòu)造函數(shù)里將listener執(zhí)行。至此我們終于找到了執(zhí)行l(wèi)istener的代碼。

在dubbo的開發(fā)中l(wèi)istener是及其重要的一個擴(kuò)展口子,在服務(wù)對外時執(zhí)行一些自己想做的事情就些各類繼承ExporterListener

在引用服務(wù)的時候想做些自己的事就寫個類繼承InvokerListener。

另外,ExporterListener為例,發(fā)現(xiàn)他的子類中有一個ExporterListenerAdapter,兩個空方法,代碼:

public abstract class ExporterListenerAdapter implements ExporterListener {

  public void exported(Exporter exporter) throws RpcException {
  }

  public void unexported(Exporter exporter) throws RpcException {
  }

}

這是個技巧吧,剛剛上面提到自己要寫擴(kuò)展類的時候就不直接繼承ExporterListener了,因為直接繼承接口會強(qiáng)制要求實現(xiàn)兩個方法的,而實際編碼中dubbo的作者應(yīng)該也發(fā)現(xiàn)這兩個方法是完全不同的業(yè)務(wù)時使用,所有我們可以只繼承ExporterListenerAdapter,如此自己的業(yè)務(wù)代碼中就不需要出現(xiàn)一個空方法了。

以上就是Listener如何在dubbo中實現(xiàn),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享標(biāo)題:Listener如何在dubbo中實現(xiàn)-創(chuàng)新互聯(lián)
鏈接URL:http://weahome.cn/article/isehh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部