Java-Programm-Dienst sauber beenden

Bibo1987

Mitglied
Hallo Java-Freunde.

Ich habe ein Anliegen, welches meinen Kopf schon seit letzter Woche zum Rauchen bringt.

Ich habe einige Funktionen, in denen Verbindungen zu einigen Servern (SQL und Bilderdienst Server) herstellt.

Diese Funktionen sind in einem Java Programm untergebracht, welches in Regelmäßigen Abständen gestartet wird oder sogar als Dienst gestartet werden soll.

Wenn das Programm geschlossen wird, soll noch eine letzte Funktion aufgerufen werden, um alle offenen Verbindungen zu schließen.

Diese Funktionen sollen auch aufgerufen werden, wenn das Programm "unerwartet beendet" wird, also durch Prozess-Tötung (kill 😀)
@EDIT
Dies ist dann doch ehr zweitrangig.

Ich habe schon versucht, das mit Threads zu lösen.

Ich habe die Funktionen in einem Thread programmiert, der ununterbrochen mit [Java]myThread.isAlive();[/Java] überwacht wird.

Aber das bringt nicht das gewünschte Ergebnis, weil dieser Threadlistener wird ja auch gekillt wird, sobald das Programm beendet wird.

Ich hoffe ich konnte mein Problem verständlich rüber bringen.

Ich danke für Antworten.

Viele Grüße
Bibo
 
Zuletzt bearbeitet:
Du könntest das evtl. mit einem Shutdownhook lösen.
Allerdings ist nicht immer gewährleistet dass der Code komplett ausgeführt wird (z.b. wenn der rechner ausgeschaltet wird, oder der strom weg ist, etc.).
 
Danke für die Antworten, aber das der Rechner ausgeschaltet wird oder der Strom weg fällt, davon brauchen wir nicht auszugehen.

Ich guck einfach mal, ob so ein Shutdownhook anwendbar ist.

Das wird imho nicht funktionieren.
Mh... Leuchtet mir auch irgendwie ein 🙂

Ist es denn möglich, irgendwie ein Event oder sowas hinzuzufügen, welches aufgerufen wird, sobald das Programm geschlossen wird?
 
Shutdownhooks machen sowas ähnliches, aber nicht im Falle einers kill, und ansosnten sind sie eher komplex und leicht falsch anzuwenden.

Wie wäre es, wenn du dafür sorgst dass es einen "shutdownmechanismus" gibt der vom User/Admin eingehalten wird?
 
Das währe natürlich die am besten klingende Methode.

Das Programm wird später vom einem Scheduler aufgerufen (MS SQL Server).
Hier kann es sein, das hier ein "beenden" des Prozesses statt findet.

Wir haben geprüft, das wenn dies passiert, bleiben die Verbindungen zu den anderen Servern (SQL und Bilderservice) offen.

Eine weitere Idee, die ich gerade hatte, ist, einen eigenständigen ProcessListener zu schreiben, der einfach guckt, ist der Prozess aktiv?
Wenn Ja, weiter ausführen
Wenn Nein, Verbindungen prüfen und beim Status aktiv müssen Sitzungen beendet werden.

Aber ich befürchte, das sich dies als doch sehr aufwendig darstellen wird.

Andere Ideen?

Vielen Dank und beste Grüße
 
Hey,
ich habe beim Recherchieren folgendes zum Shutdownhook gefunden:
The Java virtual machine shuts down in response to two kinds of events:
- The program exits normally, when the last non-daemon thread exits or when the exit (equivalently, System.exit) method is invoked, or
- The virtual machine is terminated in response to a user interrupt, such as typing ^C, or a system-wide event, such as user logoff or system shutdown.

Das mit dem ^C kommt dem Event, welches passiert, schon sehr nah.

Ich glaube die Fährte mit dem Shutdownhook bringt mich auf jeden Fall auf die richtige Spur!

Besten Dank und viele Grüße,
Bibo

Quelle:
Runtime (Java 2 Platform SE v1.4.2))
 

Zurück
Oben