dubbo學習筆記 第六章消費者啓動註冊時拋異常處理

1、異常信息java

我在部署消費者那個web應用時,會拋出如上異常,異常大致信息以下:web

java.lang.IllegalStateException: urls to invokers error .invokerUrls.size :1, invoker.size :0. urls :[dubbo:******]ide

可是彷佛不影響應用使用。測試

2、異常解決this

經過對代碼的定位(dubbo 2.5.6)咱們發現異常是在url

com.alibaba.dubbo.registry.integration.RegistryDirectory這個類的以下代碼段拋出:日誌

Map<String, Invoker<T>> newUrlInvokerMap = toInvokers(invokerUrls);// 將URL列表轉成Invoker列表
            Map<String, List<Invoker<T>>> newMethodInvokerMap = toMethodInvokers(newUrlInvokerMap); // 換方法名映射Invoker列表
            // state change
            //若是計算錯誤,則不進行處理.
            if (newUrlInvokerMap == null || newUrlInvokerMap.size() == 0) {
                logger.error(new IllegalStateException("urls to invokers error .invokerUrls.size :" + invokerUrls.size() + ", invoker.size :0. urls :" + invokerUrls.toString()));
                return;
            }

因爲這段代碼對應的方法裏面即便正常往下執行,也是要銷燬對象,因此我以爲把這個logger.error日誌註釋掉便可。若是正常往下走,會執行以下代碼段,要銷燬invoker對象:code

this.methodInvokerMap = multiGroup ? toMergeMethodInvokerMap(newMethodInvokerMap) : newMethodInvokerMap;
            this.urlInvokerMap = newUrlInvokerMap;
            try {
                destroyUnusedInvokers(oldUrlInvokerMap, newUrlInvokerMap); // 關閉未使用的Invoker
            } catch (Exception e) {
                logger.warn("destroyUnusedInvokers error. ", e);
            }

3、我的另一個想法對象

若是代碼往下研究,會發現代碼最終的緣由是com.alibaba.dubbo.registry.integration.RegistryDirectory部署

這個類的toInvokers方法中以下代碼拋出的:

這裏invoker沒有再給他實例化

invoker = new InvokerDelegete<T>(protocol.refer(serviceType, url), url, providerUrl);

這樣invoker會爲空,我本身是認爲在上面代碼加上

new InvokerDelegete<T>(protocol.refer(serviceType, url), url, providerUrl);

也是能夠解決問題,具體以下:

簡單測試也沒有問題,但沒有通過權威認證,因此只能靠你們論

不過這個異常從代碼邏輯來講,不算一個錯誤

相關文章
相關標籤/搜索