1. 程式人生 > >RPC -dubbo 服務導出實現(-)

RPC -dubbo 服務導出實現(-)

-s catch 自動 oid gui 這一 syn 代碼 urn

在閱讀此文章之前,我希望閱讀者對Spring 擴展機制的有一定的了解,比如:自定義標簽與Spring整合, InitializingBean 接口,ApplicationContextAware,BeanNameAware,

BeanFactory 接口所起到的作用 ;從來沒了解過的,請看我之前的關於Spring的博客

開始正題

(一)onApplicationEvent (事件監聽)

dubbo 服務導出的方法是在 com.alibaba.dubbo.config.spring.ServiceBean 類中,dubbo 服務的導出過程始於在Spring 容器發生刷新事件,那麽如何感知到Spring 容器發生刷新

事件呢(對於不理解刷新事件,我們可以先將它視為 Spring bean 初始化完成之後)? ~~ 得益於Spring提供的 ApplicationListener 接口,看如下代碼實現:

public void onApplicationEvent(ApplicationEvent event) {
    //在Spring bean 初始化後進行服務的導出;
        if (ContextRefreshedEvent.class.getName().equals(event.getClass().getName())) {
            if (isDelay() && ! isExported() && ! isUnexported()) {
                
if (logger.isInfoEnabled()) { logger.info("The service ready on spring started. service: " + getInterface()); } export(); } } }

實現該接口需要實現 onApplicationEvent 方法;事件的監聽,在有event 事件發生後,Spring會自動進行觸發此方法;

在Spring 容器發生刷新事件後進行導出 export(); 這一步就是最先開始的地方;

(二)檢查參數,組裝 URL

public synchronized void export() {
        if (provider != null) {
        //是否進行導出的操作,用於在我們配置了<dubbo:provider export="false" />的時候,本地進行操作,不進行服務暴露的時候
            if (export == null) {
                export = provider.getExport();
            }
            if (delay == null) {
                delay = provider.getDelay();
            }
        }
        if (export != null && ! export.booleanValue()) {
            return;
        }
        //延時導出,線程睡眠,在高版本中,此方法改變成了schedule
        if (delay != null && delay > 0) {
            Thread thread = new Thread(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(delay);
                    } catch (Throwable e) {
                    }
                    doExport();
                }
            });
            thread.setDaemon(true);
            thread.setName("DelayExportServiceThread");
            thread.start();
        } else {
            doExport();
        }
    }        

以上的方法就是進行了<dubbo:provider> 標簽屬性 export 與delay 的操作判斷;

我們繼續進行 doExport();

待續。。。

關於此篇文章受益於 :http://dubbo.apache.org/zh-cn/docs/source_code_guide/export-service.html dubbo官網文檔

RPC -dubbo 服務導出實現(-)