2011-01-15 5 views
-1

Ich habe eine Anwendung, die "für immer laufen soll". Um dies zu erreichen, befindet sich mein Code unter einer (echten) Schleife.Warum hört meine Anwendung auf zu laufen, während es eine (echte) Schleife hat?

while(true){ 

    //My code is here 
    //What it does is that it calls some Url, 
    //gets xml, parses it and stores the values to a db. 

} 

Diese Anwendung läuft als Java-Anwendung und läuft auf jdk 5 auf Redhat Linux. Nach ein oder zwei Tagen merke ich, dass das Log Aktivitäten von vor 5 Tagen hat, was bedeutet, dass es vor 5 Tagen nicht mehr funktioniert. Aber wenn ich die Java-Prozesse in der Maschine überprüfe, zeigt diese Anwendung an, dass sie läuft.

Frage: Warum ist das so ??

+1

Wie wir ohne einige eigentlichen Code wissen sollen? – Falmarri

+0

Können Sie das Protokoll anzeigen? –

Antwort

5

Eine wahrscheinliche Ursache ist, dass während der Verarbeitung dieser URLs eine Exception ausgelöst wird, die von Ihrem Code erfasst und verbraucht wird, sodass die Verarbeitung fehlschlägt, die Anwendung jedoch weiterhin ausgeführt wird. Leider haben Sie nur Kommentare, keinen echten Code gezeigt, also ist dies nur eine Hypothese.

+0

Das war eigentlich der Hauptgrund. Vielen Dank. – mwangi

3

Es gibt viele Möglichkeiten, aber ohne mehr Code kann ich nicht genau eingrenzen, auf welchen genau es ist. Hier sind einige Gedanken:

  1. Es könnte eine break Anweisung irgendwo in der Schleife sein, die die Schleife explizit verlässt.
  2. Wenn Ihre Schleife in einer Funktion und etwas in der Schleife return s von der Funktion ist, würden Sie die Schleife verlassen.
  3. Wenn etwas in der Schleife eine nicht abgefangene Ausnahme auslöst, wird die Schleife beendet. Dazu gehören auch Dinge wie OutOfMemoryError s oder StackOverflowError s.
  4. Die JVM ist möglicherweise aufgrund eines ungewöhnlichen Fehlers über Nacht abgestürzt.
  5. Ein externer Prozess beendete die JVM.
  6. Das System wurde neu gestartet, um ein Update zu installieren oder weil sich jemand eingeloggt hat und sudo reboot now ausgeführt wurde.
  7. Die Gesetze der booleschen Arithmetik haben sich geändert, und jetzt true == false. :-)
+0

Ich denke, 4, 5 und 6 sind nicht die Ursache in dieser Situation, da er sagt, die Anwendung läuft noch, nur der Thread wird gestoppt. Also ich gehe mit 7;) –

+0

7. Konnte einen einfachen Fehler im Operator == bedeuten. ;) – GolezTrol

+0

Das scheint eine "offensichtliche" Frage von der Art und Weise zu sein, wie ich es gestaltet habe, aber es ist nicht so offensichtlich. Ich habe in meiner Anwendung alle möglichen Tricks "aufgefangen". Hier ist eine weitere Beobachtung; Diese Anwendung wird auf mehr als 10 Servern in verschiedenen Ländern ausgeführt. Auf manchen Servern läuft die Anwendung etwa 10 Tage länger, bevor sie fehlschlägt, auf einigen Servern läuft sie nur eine Woche, in einigen mehr als einen Monat ... Sie verwenden verschiedene JRE-Versionen und ich denke, dass dies der Fall sein könnte ein Faktor ... Ich beobachte diese Anwendungen immer noch genau, vielleicht kann ich später die Frage neu formulieren. – mwangi

1

die Ausnahme Log:

try{ 
    while(true){ 
     // ...... 
    } 
}catch(Throwable t){ 
    //log the Throwable object 
} 
Verwandte Themen