Ich benutze tomcat. Habe in /lib-directory ein yyy.jar file mit dem Class, in dem nach der Initialisierung eine Instanze(client) wird Methode addToSchutdownHooks() aufgerufen;
ShutdownThread dt = new ShutdownThread(client);
Runtime.getRuntime().addShutdownHook(dt);
}
private static class ShutdownThread extends Thread {
private final SatelliteUdbClient client;
public ShutdownThread(final SatelliteUdbClient client) {
this.client = client;
}
@Override
public void run() {
if (client != null) {
try {
client.stop();
} catch (Throwable t) {
}
}
}
}
Ich deploy mein xxx.war file in tomcat, der unter bestimmten Vornussätzungen auf yyy.jar zugreift und die Methode addToSchutdownHooks() wird aufgerufen.
Beim runterfahren von tomcate wird run() Methode aber nicht ausgefüllt. Warum???
Ich habe gesucht gefunden und angewendet, leider FUNKTIONIERT NICHT… deswegen frage ich ob ich irgendwas nicht berücksichtigt habe. ServletContextListener habe ich auch angekuckt. Man braucht einen Eintrag in web.xml. Ich habe aber externen .jar und nicht .war file und keine web.xml datei.
mir fällt auf, dass du nirgens Log-Ausgaben hast. Wieso bist Du dir sicher, dass die Methoden nicht oder ausgeführt werden?
Beachte bitte den Stackoverflow - Eintrag von Slater. - Diese Methoden werden nur bei einem ordentlichen shutdown der jvm ausgeführt. Nicht etwa bei einem KILL oder sonstigen harten abbrüchen.
Und auch nur dann wenn Zeit ist. Du kannst da keine Aufräumarbeiten durchführen.
Ist das hier eine Webanwendung oder eine Desktopanwendung, über die wir reden?
Hallo und Danke für deine Meldung,
ich hatte log Ausgaben in run() Methode, die wurden nicht ausgegeben…
Ich habe eine WEB-Application (besteht aus 2 war files). Beider sollen auf externen .jar Files zugreifen und Client-Instanz (das ist ein statisches Objekt) teilen. Das funktioniert. Ich habe eine shutdownapplication.sh Datei in tomcat die mein Programm runterfährt. Ich möchte den client Instanz über ShutDown Hook stoppen/runterfahren. Im Moment kann ich tomcat nictt korrekt runterfahren, muss dann mit kill -9 beenden.
NZ
[QUOTE=Unregistriert]Ich habe gesucht gefunden und angewendet, leider FUNKTIONIERT NICHT… deswegen frage ich ob ich irgendwas nicht berücksichtigt habe.
[/QUOTE]
ruhig immer dazu schreiben, welche essentiell zum Thema gehörenden Dinge schon bekannt,
dann muss man sie nicht abklappern
Man braucht einen Eintrag in web.xml. Ich habe aber externen .jar und nicht .war file und keine web.xml datei.
ich bin dazu vielleicht zu sehr eingerostet, und will jetzt gerade auch nicht selber alles nachlesen
falls ich eher nerve dann ruhig ignorieren,
ansonsten:
wie funktioniert das denn mit dem Jar, wie kann man einfach auf web.xml verzichten?
was ist mit all den Aufgaben dieser zentralen Konfiguration,
wer übernimmt diese und ist dabei keine Alternative für ServletContextListener erwähnt?
kann man das vielleicht auch im Programm noch selber per Code hinzufügen,
request.getContext().addListener()wasauchimmer?
an sich nicht gerade fein gegenüber XML-Konfiguration, je nach Geschmack,
aber mit dem ShutdownHook-Registrieren hättest du ja eh eine solche Codestelle,
dann könntest du auch das andere registrieren
ach so, der Code gehört wohl nicht zu einer der Web-Applikationen, sondern zum Jar, zum Tool?
da wäre es natürlich schön, das Abmelden nur im Tool zu verwalten, ganz egal wer es nutzt, soll gar nicht wissen dass es Web-Applikationen/ Tomcat gibt?
tja, diese schöne Welt gilt wohl nicht,
ob das einer oder mehreren Webappliklationen aufzudrücken ist, ist durchaus fraglich,
vielleicht meldet sich jedes Nutzungsprogramm an und wieder ab (ab in ServletContextListener),
wenn die Zahl der Nutzer auf 0 sinkt, dann beenden
Das ist genau dein Problem. Du schießt einfach ein Programm hart ab - wie soll man da noch einen geordneten Rückzug antreten können?
Du solltest dir vielleicht als allererstes mal ansehen wie du deine Applikation und die Serverkonfiguration so auf einander einstellen kannst damit du ohne eine martialisches ‚kill‘ auskommst.
Shutdownhooks an sich sind schon problemtaisch, aber in Tomcat meist reine Zeitverschwendung.
Bevor die VM beendet wird, werden die WebApps gestoppt und (falls moeglich) die Klassen verworfen welche die WebApps geladen hatten (haben ja ihre eigenen Classloader). d.h. bevor die VM gestoppt wird und dein ShutdownHook ausgefuehrt wird, ist die Klasse schon gar nicht mehr da.
Man kann im JEE Umfeld nicht wie in SE programmieren.
Nimm einen ServletContextListener und gut ist.
schreib dir nen kurzes Shellscript, welches mittels curl bzw wget eine URL auf jeder Webapp. aufruft, die das “Stop Signal” signalisiert.
(hierbei wird dein Client beendet)
-> dann Timeout von x Sekunden abwarten bis der client beendet ist und dann führt das Shellscript das tomcat shutdown.sh script aus.
[QUOTE=maki]Shutdownhooks an sich sind schon problemtaisch, aber in Tomcat meist reine Zeitverschwendung.
Bevor die VM beendet wird, werden die WebApps gestoppt und (falls moeglich) die Klassen verworfen welche die WebApps geladen hatten (haben ja ihre eigenen Classloader). d.h. bevor die VM gestoppt wird und dein ShutdownHook ausgefuehrt wird, ist die Klasse schon gar nicht mehr da.
Man kann im JEE Umfeld nicht wie in SE programmieren.
Nimm einen ServletContextListener und gut ist.[/QUOTE]
wie kann man sich das vorstellen? dass der ShutdownHook nicht ausgeführt wird, ist ja noch eine Sache,
aber ‘verworfene Klassen’ wenn es den ShutdownHook als Listener gibt, das SatelliteUdbClient-Objekt verlinkt ist, kann das einfach so zerstört werden?
freilich, wenn die WebApplication beendet wird, muss mit deren Servlets, vielleicht laufenden Threads, statischen Variablen auch nicht zimperlich umgegangen werden,
das ShutdownThread-Objekt zu removen wäre ein Vorgang, der Objektfreigabe halbwegs normal erklärt, passiert das?
wie kann man sich das vorstellen? dass der ShutdownHook nicht ausgeführt wird, ist ja noch eine Sache,
aber ‚verworfene Klassen‘ wenn es den ShutdownHook als Listener gibt, das SatelliteUdbClient-Objekt verlinkt ist, kann das einfach so zerstört werden?
Idealweise sollte das genauso so funktionieren.
Wenn nicht, hat man was falsch gemacht Sowas verhindert dann auch das saubere neustarten/updaten der Anwendung.
freilich, wenn die WebApplication beendet wird, muss mit deren Servlets, vielleicht laufenden Threads, statischen Variablen auch nicht zimperlich umgegangen werden,
das ShutdownThread-Objekt zu removen wäre ein Vorgang, der Objektfreigabe halbwegs normal erklärt, passiert das?
WebApps sollen alle voneinander isoliert sein, versucht wird das mit „privaten“ ClassLoadern, einer po WebApp.
JEE (und auch Servlets gehoeren dazu) schraenkt eben einerseits ein, anderseits gibt dafuer aber Garantien bzw. andere Moeglichkeiten, ein „managed Environment“ eben.
Z.b. darf man in EJBs keine Threads starten, kein java.io.File nutzen usw. usf.
Ist eben anders als mit SE Anwendungen, wo man machen darf was man will…