新聞中心
ZooKeeper異常該怎么解決,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)建站專注于通江企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城系統(tǒng)網(wǎng)站開發(fā)。通江網(wǎng)站建設(shè)公司,為通江等地區(qū)提供建站服務(wù)。全流程按需規(guī)劃網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
在Java API中的每一個(gè)ZooKeeper操作都在其throws子句中聲明了兩種類型的異常,分別是InterruptedException和KeeperException。
(一)InterruptedException異常
如果操作被中斷,則會(huì)有一個(gè)InterruptedException異常被拋出。在Java語言中有一個(gè)取消阻塞方法的標(biāo)準(zhǔn)機(jī)制,即針對存在阻塞方法的線程調(diào)用interrupt()。一個(gè)成功的取消操作將產(chǎn)生一個(gè)InterruptedException異常。
ZooKeeper也遵循這一機(jī)制,因此你可以使用這種方法來取消一個(gè)ZooKeeper操作。使用了ZooKeeper的類或庫通常會(huì)傳播InterruptedException異常,使客戶端能夠取消它們的操作。InterruptedException異常并不意味著有故障,而是表明相應(yīng)的操作已經(jīng)被取消,所以在配置服務(wù)的示例中,可以通過傳播異常來中止應(yīng)用程序的運(yùn)行。
(二)KeeperException異常
(1) 如果ZooKeeper服務(wù)器發(fā)出一個(gè)錯(cuò)誤信號(hào)或與服務(wù)器存在通信問題,拋出的則是KeeperException異常。
①針對不同的錯(cuò)誤情況,KeeperException異常存在不同的子類。
例如: KeeperException.NoNodeException是KeeperException的一個(gè)子類,如果你試圖針對一個(gè)不存在的znode執(zhí)行操作,拋出的則是該異常。
②每一個(gè)KeeperException異常的子類都對應(yīng)一個(gè)關(guān)于錯(cuò)誤類型信息的代碼。
例如: KeeperException.NoNodeException異常的代碼是KeeperException.Code.NONODE
(2) 有兩種方法被用來處理KeeperException異常:
①捕捉KeeperException異常,并且通過檢測它的代碼來決定采取何種補(bǔ)救措施;
②另一種是捕捉等價(jià)的KeeperException子類,并且在每段捕捉代碼中執(zhí)行相應(yīng)的操作。
(3) KeeperException異常分為三大類
① 狀態(tài)異常
當(dāng)一個(gè)操作因不能被應(yīng)用于znode樹而導(dǎo)致失敗時(shí),就會(huì)出現(xiàn)狀態(tài)異常。狀態(tài)異常產(chǎn)生的原因通常是在同一時(shí)間有另外一個(gè)進(jìn)程正在修改znode。例如,如果一個(gè)znode先被另外一個(gè)進(jìn)程更新了,根據(jù)版本號(hào)執(zhí)行setData操作的進(jìn)程就會(huì)失敗,并收到一個(gè)KeeperException.BadVersionException異常,這是因?yàn)榘姹咎?hào)不匹配。程序員通常都知道這種沖突總是存在的,也都會(huì)編寫代碼來進(jìn)行處理。
一些狀態(tài)異常會(huì)指出程序中的錯(cuò)誤,例如KeeperException.NoChildrenForEphemeralsException異常,試圖在短暫znode下創(chuàng)建子節(jié)點(diǎn)時(shí)就會(huì)拋出該異常。
② 可恢復(fù)異常
可恢復(fù)的異常是指那些應(yīng)用程序能夠在同一個(gè)ZooKeeper會(huì)話中恢復(fù)的異常。一個(gè)可恢復(fù)的異常是通過KeeperException.ConnectionLossException來表示的,它意味著已經(jīng)丟失了與ZooKeeper的連接。ZooKeeper會(huì)嘗試重新連接,并且在大多數(shù)情況下重新連接會(huì)成功,并確保會(huì)話是完整的。
但是ZooKeeper不能判斷與KeeperException.ConnectionLossException異常相關(guān)的操作是否成功執(zhí)行。這種情況就是部分失敗的一個(gè)例子。這時(shí)程序員有責(zé)任來解決這種不確定性,并且根據(jù)應(yīng)用的情況來采取適當(dāng)?shù)牟僮鳌T谶@一點(diǎn)上,就需要對“冪等”(idempotent)操作和“非冪等”(Nonidempotent)操作進(jìn)行區(qū)分。冪等操作是指那些一次或多次執(zhí)行都會(huì)產(chǎn)生相同結(jié)果的操作,例如讀請求或無條件執(zhí)行的setData操作。對于冪等操作,只需要簡單地進(jìn)行重試即可。對于非冪等操作,就不能盲目地進(jìn)行重試,因?yàn)樗鼈兌啻螆?zhí)行的結(jié)果與一次執(zhí)行是完全不同的。程序可以通過在znode的路徑和它的數(shù)據(jù)中編碼信息來檢測是否非冪等操怍的更新已經(jīng)完成。
③不可恢復(fù)的異常
在某些情況下,ZooKeeper會(huì)話會(huì)失效——也許因?yàn)槌瑫r(shí)或因?yàn)闀?huì)話被關(guān)閉,兩種情況下都會(huì)收到KeeperException.SessionExpiredException異常,或因?yàn)樯矸蒡?yàn)證失敗,KeeperException.AuthFailedException異常。無論上述哪種情況,所有與會(huì)話相關(guān)聯(lián)的短暫znode都將丟失,因此應(yīng)用程序需要在重新連接到ZooKeeper之前重建它的狀態(tài)。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
本文題目:ZooKeeper異常該怎么解決
瀏覽地址:http://www.dlmjj.cn/article/gcsccc.html