RPC -dubbo 服務導出實現(-)
阿新 • • 發佈:2018-12-26
-s catch 自動 oid gui 這一 syn 代碼 urn
(二)檢查參數,組裝 URL
在閱讀此文章之前,我希望閱讀者對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 服務導出實現(-)