2014-10-10 44 views
0

假設我的拓撲結構是這樣簡單:如何故意拋出RuntimeException?

Spout --> Bolt A --> Bolt B --> Bolt C 

和螺栓C存儲在數據存儲中的數據。

無論何時在存儲數據時有一些異常,現在建議拋出一個RuntimeException? 喜歡的東西:

try { 
    datastoreManager.insert(myData); 
} catch (Exception e) { 
    throw new RuntimeException(e); 
} 

或者我應該只是拋出一個FailedException,讓拓撲重試元組?

什麼應該是一個好的做法?

我在這裏故意拋出一個RuntimeException沒有看到任何傷害,因爲當發生這種情況時,當前工作線程死亡,並且由於拓撲沒有收到ACK,這個元組將在其他一些worker上重新嘗試,與通過拋出FailedException 除了拓撲上的某些增強負載)相同的總輸出。

回答

0

考慮的RuntimeException

public DataException extends RuntimeException { 
} 

try { 
    datastoreManager.insert(myData); 
} catch (Exception e) { 
    throw new DataException(e); 
} 

現在的類延伸高於在調用層次可以捕獲這個特定的異常或讓它傳播起來。

因爲這沒有被選中,你可能想在Java文檔添加足夠的文件,讓呼叫者期待一個RuntimeException

0

你想在正被拋出的異常的類型,再深入一點。如果它是暫時的,就像連接錯誤一樣,您可以拋出一個FailedException並讓拓撲重播它。但是,您不希望這樣做會出現需要注意修復的錯誤。在這種情況下,您想拋出一個自定義錯誤,提供足夠的信息來解決問題 - http://bugroll.com/how-to-write-good-error-messages.html

0

我不知道您的系統的要求以及什麼是正確的語義。但我是你,我不會拋出異常。我會做的是:如果拋出異常,我會抓住它並將myData狀態的身份保存到持久存儲區(例如Apache kafka或JBoss HornetQ)中,並將身份保存到持久存儲區。

在您分析出錯後,您可以回覆您的活動。

同樣,如果您的系統需要更嚴格的語義,這可能不被接受。

相關問題