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);
也是能夠解決問題,具體以下:
簡單測試也沒有問題,但沒有通過權威認證,因此只能靠你們論
不過這個異常從代碼邏輯來講,不算一個錯誤