Eine Ausnahme verzögern


1

Ich habe eine Methode, die in regelmäßigen Abständen (z. B. einmal alle 10 Sekunden) versucht, eine Verbindung zu einem Server herzustellen und einige Daten daraus zu lesen. Der Server ist möglicherweise nicht immer verfügbar. Wenn der Server nicht verfügbar ist, löst die Methode eine Ausnahme aus.

Was wäre der beste Weg, um eine Wrapper-Methode zu implementieren, die keine Ausnahme auslöst, außer wenn der Server für mindestens eine Minute nicht verfügbar war?

7

Behalten Sie im Auge, wann Sie das letzte Mal erfolgreich den Server erreicht haben. Wenn der Server eine Ausnahme auslöst, fangen Sie ihn ab und vergleichen Sie ihn mit dem letzten Mal, als Sie den Server erreicht haben. Wenn diese Zeit länger als eine Minute ist, wiederholen Sie die Ausnahme.

  0

Server wirft nicht wirklich eine Ausnahme, es ist der Client-Code, der wirft;) Allerdings habe ich immer noch +1 für Ihre Antwort gewählt. 23 sep. 082008-09-23 21:07:39


1

Sie müssen die Zeit aufzeichnen, die Sie ursprünglich versuchen, eine Verbindung mit dem Server herzustellen, und dann die Ausnahme abfangen. Wenn die Zeit, in der die Ausnahme abgefangen wird, mehr als die ursprüngliche Zeit + 1 Minute beträgt, wiederholen Sie die Ausnahme. Wenn nicht, versuchen Sie es erneut.

  0

Ich wurde fertig geschnippelt. 23 sep. 082008-09-23 21:07:00


1

Im Idealfall können Sie eine Zeitüberschreitung für den Anruf zum Server setzen. Wenn das fehlschlägt, führe thread.sleep (600) im catch-Block aus und versuche es erneut und scheitere, wenn der zweite nicht zurückkehrt.

  0

Timeout kommt mir auch in den Sinn. 24 sep. 082008-09-24 03:38:02


3

Im Pseudocode.

//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); 
    } 

} 

0

Sie könnten eine Wiederholungsanzahl haben, und wenn die gewünschte Zählung (6 in Ihrem Fall) erfüllt war dann eine Ausnahme aus

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; 
    } 
} 
} 

0

Sie eine boolean Variable können, ob die Server-Verbindung erfolgreich war, und überprüfen sie es in Ihre Exception-Handler, etwa so:

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; 
     } 
    } 
    } 
} 

ich weiß nicht, was die tatsächliche Zeit APIs sind, da es schon eine Weile her, seit ich das letzte Mal Java verwendet. Dies wird tun, was Sie fragen, aber etwas daran scheint nicht richtig. Das Polling für Ausnahmen erscheint mir ein bisschen rückwärts, aber da es sich um einen Server handelt, fällt mir nichts anderes ein.


1

Denken Sie daran, dass Ausnahme Handhabung ist nur eine sehr spezialisierte Verwendung der üblichen "Rückkehr" -System. (Weitere technische Informationen finden Sie unter "Monaden".) Wenn die Ausnahmesituation, die Sie melden möchten, nicht in das Ausnahmebehandlungssystem von Java passt, ist es unter Umständen nicht angebracht, Ausnahmen zu verwenden.

Sie können die Fehlerbedingungen auf die übliche Weise verfolgen: Halten Sie eine Statusvariable, aktualisieren Sie sie bei Bedarf mit Erfolgs-/Fehlerinformationen und reagieren Sie entsprechend, wenn sich der Status ändert.