我有一種方法,定期(例如每10秒一次)嘗試連接到服務器,並從中讀取一些數據。服務器可能一直不可用。如果服務器不可用,則該方法會引發異常。延遲例外
實現一個包裝器方法的最佳方式是什麼?除非服務器至少一分鐘不可用,否則不會引發異常?
我有一種方法,定期(例如每10秒一次)嘗試連接到服務器,並從中讀取一些數據。服務器可能一直不可用。如果服務器不可用,則該方法會引發異常。延遲例外
實現一個包裝器方法的最佳方式是什麼?除非服務器至少一分鐘不可用,否則不會引發異常?
記錄上次成功到達服務器的時間。如果服務器引發異常,請抓住它並與上次到達服務器的時間進行比較。如果該時間超過一分鐘,請重新拋出異常。
您必須記錄最初嘗試連接到服務器的時間,然後捕獲異常。如果捕獲異常的時間大於原始時間+ 1分鐘,則重新拋出異常。如果不是,請重試。
我完成了狙擊。 – brian 2008-09-23 21:07:00
理想情況下,您可以在對服務器的調用中設置超時。如果沒有在catch塊中執行thread.sleep(600)並再次嘗試,並且如果第二個沒有返回則失敗。
超時彈出我的腦海。 – marcospereira 2008-09-24 03:38:02
僞代碼。
//Create Timer
//Start Timer
bool connected = false;
while (!connected)
try {
//Connect To DB
connected = true;
}
catch (Exception ex) {
if (more than 1 minute has passed)
throw new Exception(ex);
}
}
你可以有一個重試次數,如果(在你的案件6)所需的數量已經滿足,然後拋出一個異常
int count = 0;
CheckServer(count);
public void CheckServer(count) {
try
{
// connect to server
}
catch(Exception e)
{
if(count < MAX_ATTEMPTS) {
// wait 10 seconds
CheckServer(count++)
}
else {
throw e;
}
}
}
你可以設置一個boolean變量是否不服務器連接成功,並檢查它在異常處理程序,就像這樣:
class ServerTester : public Object
{
private bool failing;
private ServerConnection serverConnection;
private Time firstFailure;
public ServerTester(): failing(false)
{
}
public void TestServer() throws ServerException
{
try
{
serverConnection.Connect();
failing = false;
}
catch (ServerException e)
{
if (failing)
{
if (Time::GetTime() - firstFailure > 60)
{
failing = false;
throw e;
}
}
else
{
firstFailure = Time::GetTime();
failing = true;
}
}
}
}
我不知道實際時間的API是什麼,因爲它已經有一段時間,因爲我最後一次使用的Java。這會做你的問題,但有關它似乎並不正確。對異常進行輪詢會讓我覺得有些倒退,但是由於你在處理服務器,所以我想不出任何其他方式。
記住,異常處理僅僅是一個通常的「回報」系統非常專業的使用。 (有關更多技術細節,請參閱「monad」。)如果您想要發送的異常情況不適合Java的異常處理系統,則可能不適合使用異常。
您可以跟蹤的錯誤條件的常用方法:保持狀態變量,根據需要用成功/失敗信息更新,並適當地作爲狀態的變化。
服務器實際上並沒有拋出異常,它是拋出的客戶端代碼;)但是,我仍然爲您的答案投了+1。 – 2008-09-23 21:07:39