dubbo循環依賴的解決

開發時遇到一個dubbo子系統之間循環調用的問題,糾結了好幾天,今天發現官網是這麼說的:java


啓動時檢查

(+) (#)編程

Dubbo缺省會在啓動時檢查依賴的服務是否可用,不可用時會拋出異常,阻止Spring初始化完成,以便上線時,能及早發現問題,默認check=true。
若是你的Spring容器是懶加載的,或者經過API編程延遲引用服務,請關閉check,不然服務臨時不可用時,會拋出異常,拿到null引用,若是check=false,老是會返回引用,當服務恢復時,能自動連上。

能夠經過check="false"關閉檢查,好比,測試時,有些服務不關心,或者出現了循環依賴,必須有一方先啓動。ide

關閉某個服務的啓動時檢查:(沒有提供者時報錯)測試

< dubbo:reference interface = "com.foo.BarService" check = "false" />

關閉全部服務的啓動時檢查:(沒有提供者時報錯)ui

< dubbo:consumer check = "false" />

關閉註冊中心啓動時檢查:(註冊訂閱失敗時報錯)spa

< dubbo:registry check = "false" />

也能夠用dubbo.properties配置:代理

dubbo.properties
dubbo.reference.com.foo.BarService.check=false
dubbo.reference.check=false
dubbo.consumer.check=false
dubbo.registry.check=false

也能夠用-D參數:code

java -Ddubbo.reference.com.foo.BarService.check=false
java -Ddubbo.reference.check=false
java -Ddubbo.consumer.check=false
java -Ddubbo.registry.check=false
注意區別
  • dubbo.reference.check=false,強制改變全部reference的check值,就算配置中有聲明,也會被覆蓋。
  • dubbo.consumer.check=false,是設置check的缺省值,若是配置中有顯式的聲明,如:<dubbo:reference check="true"/>,不會受影響。
  • dubbo.registry.check=false,前面兩個都是指訂閱成功,但提供者列表是否爲空是否報錯,若是註冊訂閱失敗時,也容許啓動,需使用此選項,將在後臺定時重試。

引用缺省是延遲初始化的,只有引用被注入到其它Bean,或被getBean()獲取,纔會初始化。
若是須要飢餓加載,即沒有人引用也當即生成動態代理,能夠配置:xml

< dubbo:reference interface = "com.foo.BarService" init = "true" />

mark一下,以備後用。

相關文章
相關標籤/搜索