成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

dubbo源碼解析(二十一)遠(yuǎn)程調(diào)用——Listener

simpleapples / 2902人閱讀

摘要:源碼分析一該類實(shí)現(xiàn)了,是服務(wù)引用監(jiān)聽器的包裝類。取消暴露遍歷監(jiān)聽集合監(jiān)聽取消暴露該方法是對(duì)每個(gè)取消服務(wù)暴露的監(jiān)聽。五暴露服務(wù)取消暴露服務(wù)該類是服務(wù)暴露監(jiān)聽器的適配類,沒有做實(shí)際的操作。

遠(yuǎn)程調(diào)用——Listener
目標(biāo):介紹dubbo-rpc-api中的各種listener監(jiān)聽器的實(shí)現(xiàn)邏輯,內(nèi)容略少,隨便撇兩眼,不是重點(diǎn)。
前言

本文介紹監(jiān)聽器的相關(guān)邏輯。在服務(wù)引用和服務(wù)發(fā)現(xiàn)中監(jiān)聽器處于的位置請(qǐng)看下面的圖:

服務(wù)暴露:

服務(wù)引用:

這兩個(gè)監(jiān)聽器所做的工作不是很多,來看看源碼理解一下。

源碼分析 (一)ListenerInvokerWrapper

該類實(shí)現(xiàn)了Invoker,是服務(wù)引用監(jiān)聽器的包裝類。

1.屬性
/**
 * invoker對(duì)象
 */
private final Invoker invoker;

/**
 * 監(jiān)聽器集合
 */
private final List listeners;

用到了裝飾模式,其中很多實(shí)現(xiàn)方法直接調(diào)用了invoker的方法。

2.構(gòu)造方法
public ListenerInvokerWrapper(Invoker invoker, List listeners) {
    // 如果invoker為空則拋出異常
    if (invoker == null) {
        throw new IllegalArgumentException("invoker == null");
    }
    this.invoker = invoker;
    this.listeners = listeners;
    if (listeners != null && !listeners.isEmpty()) {
        // 遍歷監(jiān)聽器
        for (InvokerListener listener : listeners) {
            if (listener != null) {
                try {
                    // 調(diào)用在服務(wù)引用的時(shí)候進(jìn)行監(jiān)聽
                    listener.referred(invoker);
                } catch (Throwable t) {
                    logger.error(t.getMessage(), t);
                }
            }
        }
    }
}

構(gòu)造方法中直接調(diào)用了監(jiān)聽器的服務(wù)引用。

3.destroy
@Override
public void destroy() {
    try {
        // 銷毀invoker
        invoker.destroy();
    } finally {
        // 銷毀所有監(jiān)聽的實(shí)體域
        if (listeners != null && !listeners.isEmpty()) {
            for (InvokerListener listener : listeners) {
                if (listener != null) {
                    try {
                        listener.destroyed(invoker);
                    } catch (Throwable t) {
                        logger.error(t.getMessage(), t);
                    }
                }
            }
        }
    }
}

該方法是把服務(wù)引用的監(jiān)聽器銷毀。

(二)InvokerListenerAdapter
public abstract class InvokerListenerAdapter implements InvokerListener {

    /**
     * 引用服務(wù)
     * @param invoker
     * @throws RpcException
     */
    @Override
    public void referred(Invoker invoker) throws RpcException {
    }

    /**
     * 銷毀
     * @param invoker
     */
    @Override
    public void destroyed(Invoker invoker) {
    }

}

該類是服務(wù)引用監(jiān)聽器的適配類,沒有做實(shí)際的操作。

(三)DeprecatedInvokerListener
@Activate(Constants.DEPRECATED_KEY)
public class DeprecatedInvokerListener extends InvokerListenerAdapter {

    private static final Logger LOGGER = LoggerFactory.getLogger(DeprecatedInvokerListener.class);

    @Override
    public void referred(Invoker invoker) throws RpcException {
        // 當(dāng)該引用的服務(wù)被廢棄時(shí),打印錯(cuò)誤日志
        if (invoker.getUrl().getParameter(Constants.DEPRECATED_KEY, false)) {
            LOGGER.error("The service " + invoker.getInterface().getName() + " is DEPRECATED! Declare from " + invoker.getUrl());
        }
    }

}

該類是當(dāng)調(diào)用廢棄的服務(wù)時(shí)候打印錯(cuò)誤日志。

(四)ListenerExporterWrapper

該類是服務(wù)暴露監(jiān)聽器包裝類。

1.屬性
/**
 * 服務(wù)暴露者
 */
private final Exporter exporter;

/**
 * 服務(wù)暴露監(jiān)聽者集合
 */
private final List listeners;

用到了裝飾模式,其中很多實(shí)現(xiàn)方法直接調(diào)用了exporter的方法。

2.構(gòu)造方法
public ListenerExporterWrapper(Exporter exporter, List listeners) {
    if (exporter == null) {
        throw new IllegalArgumentException("exporter == null");
    }
    this.exporter = exporter;
    this.listeners = listeners;
    if (listeners != null && !listeners.isEmpty()) {
        RuntimeException exception = null;
        // 遍歷服務(wù)暴露監(jiān)聽集合
        for (ExporterListener listener : listeners) {
            if (listener != null) {
                try {
                    // 暴露服務(wù)監(jiān)聽
                    listener.exported(this);
                } catch (RuntimeException t) {
                    logger.error(t.getMessage(), t);
                    exception = t;
                }
            }
        }
        if (exception != null) {
            throw exception;
        }
    }
}

該方法中對(duì)于每個(gè)服務(wù)暴露進(jìn)行監(jiān)聽。

3.unexport
@Override
public void unexport() {
    try {
        // 取消暴露
        exporter.unexport();
    } finally {
        if (listeners != null && !listeners.isEmpty()) {
            RuntimeException exception = null;
            // 遍歷監(jiān)聽集合
            for (ExporterListener listener : listeners) {
                if (listener != null) {
                    try {
                        // 監(jiān)聽取消暴露
                        listener.unexported(this);
                    } catch (RuntimeException t) {
                        logger.error(t.getMessage(), t);
                        exception = t;
                    }
                }
            }
            if (exception != null) {
                throw exception;
            }
        }
    }
}

該方法是對(duì)每個(gè)取消服務(wù)暴露的監(jiān)聽。

(五)ExporterListenerAdapter
public abstract class ExporterListenerAdapter implements ExporterListener {

    /**
     * 暴露服務(wù)
     * @param exporter
     * @throws RpcException
     */
    @Override
    public void exported(Exporter exporter) throws RpcException {
    }

    /**
     * 取消暴露服務(wù)
     * @param exporter
     * @throws RpcException
     */
    @Override
    public void unexported(Exporter exporter) throws RpcException {
    }

}

該類是服務(wù)暴露監(jiān)聽器的適配類,沒有做實(shí)際的操作。

后記
該部分相關(guān)的源碼解析地址:https://github.com/CrazyHZM/i...

該文章講解了在服務(wù)引用和服務(wù)暴露中的各種listener監(jiān)聽器,其中內(nèi)容很少。接下來我將開始對(duì)rpc模塊的協(xié)議protocol進(jìn)行講解。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72891.html

相關(guān)文章

  • dubbo源碼解析(四十八)異步化改造

    摘要:大揭秘異步化改造目標(biāo)從源碼的角度分析的新特性中對(duì)于異步化的改造原理??丛创a解析四十六消費(fèi)端發(fā)送請(qǐng)求過程講到的十四的,在以前的邏輯會(huì)直接在方法中根據(jù)配置區(qū)分同步異步單向調(diào)用。改為關(guān)于可以參考源碼解析十遠(yuǎn)程通信層的六。 2.7大揭秘——異步化改造 目標(biāo):從源碼的角度分析2.7的新特性中對(duì)于異步化的改造原理。 前言 dubbo中提供了很多類型的協(xié)議,關(guān)于協(xié)議的系列可以查看下面的文章: du...

    lijinke666 評(píng)論0 收藏0
  • dubbo源碼解析(四十六)消費(fèi)端發(fā)送請(qǐng)求過程

    摘要:可以參考源碼解析二十四遠(yuǎn)程調(diào)用協(xié)議的八。十六的該類也是用了適配器模式,該類主要的作用就是增加了心跳功能,可以參考源碼解析十遠(yuǎn)程通信層的四。二十的可以參考源碼解析十七遠(yuǎn)程通信的一。 2.7大揭秘——消費(fèi)端發(fā)送請(qǐng)求過程 目標(biāo):從源碼的角度分析一個(gè)服務(wù)方法調(diào)用經(jīng)歷怎么樣的磨難以后到達(dá)服務(wù)端。 前言 前一篇文章講到的是引用服務(wù)的過程,引用服務(wù)無非就是創(chuàng)建出一個(gè)代理。供消費(fèi)者調(diào)用服務(wù)的相關(guān)方法。...

    fish 評(píng)論0 收藏0
  • dubbo源碼解析(四十七)服務(wù)端處理請(qǐng)求過程

    摘要:而存在的意義就是保證請(qǐng)求或響應(yīng)對(duì)象可在線程池中被解碼,解碼完成后,就會(huì)分發(fā)到的。 2.7大揭秘——服務(wù)端處理請(qǐng)求過程 目標(biāo):從源碼的角度分析服務(wù)端接收到請(qǐng)求后的一系列操作,最終把客戶端需要的值返回。 前言 上一篇講到了消費(fèi)端發(fā)送請(qǐng)求的過程,該篇就要將服務(wù)端處理請(qǐng)求的過程。也就是當(dāng)服務(wù)端收到請(qǐng)求數(shù)據(jù)包后的一系列處理以及如何返回最終結(jié)果。我們也知道消費(fèi)端在發(fā)送請(qǐng)求的時(shí)候已經(jīng)做了編碼,所以我...

    yzzz 評(píng)論0 收藏0
  • dubbo源碼解析二十二)遠(yuǎn)程調(diào)用——Protocol

    摘要:七該類也實(shí)現(xiàn)了,也是裝飾了接口,但是它是在服務(wù)引用和暴露過程中加上了監(jiān)聽器的功能。如果是注冊(cè)中心,則暴露該創(chuàng)建一個(gè)暴露者監(jiān)聽器包裝類對(duì)象該方法是在服務(wù)暴露上做了監(jiān)聽器功能的增強(qiáng),也就是加上了監(jiān)聽器。 遠(yuǎn)程調(diào)用——Protocol 目標(biāo):介紹遠(yuǎn)程調(diào)用中協(xié)議的設(shè)計(jì)和實(shí)現(xiàn),介紹dubbo-rpc-api中的各種protocol包的源碼,是重點(diǎn)內(nèi)容。 前言 在遠(yuǎn)程調(diào)用中協(xié)議是非常重要的一層,看...

    孫淑建 評(píng)論0 收藏0
  • dubbo源碼解析(四十四)服務(wù)暴露過程

    摘要:服務(wù)暴露過程目標(biāo)從源碼的角度分析服務(wù)暴露過程。導(dǎo)出服務(wù),包含暴露服務(wù)到本地,和暴露服務(wù)到遠(yuǎn)程兩個(gè)過程。其中服務(wù)暴露的第八步已經(jīng)沒有了。將泛化調(diào)用版本號(hào)或者等信息加入獲得服務(wù)暴露地址和端口號(hào),利用內(nèi)數(shù)據(jù)組裝成。 dubbo服務(wù)暴露過程 目標(biāo):從源碼的角度分析服務(wù)暴露過程。 前言 本來這一篇一個(gè)寫異步化改造的內(nèi)容,但是最近我一直在想,某一部分的優(yōu)化改造該怎么去撰寫才能更加的讓讀者理解。我覺...

    light 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<