static usw
Hi -
stimmt mit dem JBoss könnte man das machen, nur leider wollte
ich nicht den großen Aufwand in ein kleines Programm/Servlet
stecken.
Wo du recht hast, hast du recht 
Ich erstelle jetzt den Thread in meinem Servlet in
der init() und zerstöre ihn in der destroy() des Servlets. Das
sollte so weit dann sicher sein,
Die Init- bzw. Destroy-Methoden werden (wenn ich dich richtig verstanden habe) nicht dann aufgerufen, wenn du das möchtest. Der Servlet-Container kann das machen, wann er will. Die Init-Methode wird normalerweise nur beim Server- bzw. Applikationsstart aufgerufen (Und wenn Aufgrund hoher Auslastung noch mehr Instanzen von dem Servlet benötigt werden). Dh. Wenn Tomcat beim hochfahren standardmäßig 20 Instanzen deines Servlets in den Speicher stellt, wird dein Thread 20 mal gestartet (Ausser du sagtst in der Web.xml dass du nur max. 1 Servlet starten möchtest = Bottleneck).
Du hast ebenfalls nicht unter Kontrolle, wann die destroy-Methode eines Servlets aufgerufen wird. Benötigt der Server Speicher für andere Sachen, kann es dir passieren dass deine Servlets nacheinander aus dem Speicher gekickt werden - Inclusive deinem Datenthread. Dh. du kannst dir nicht sicher sein, dass der Thread auch wirklich immer ausgeführt wird.
Was für dich interessant sein dürfte ist folgendes: Die Ausführung eines Servlets muß nicht wirklich mit der Ausgabe an den Browser abgeschlossen sein. Dh. Du kannst nach dem Senden des Outputs oder nach dem Senden eines Redirects ruhig noch Code schreiben und ausführen lassen.
Ich würde dir wirklich die allererste Variante empfehlen:
Dein(e) Servlet(s) haben einen static Timestamp (static erkläre ich unten nochmal), welcher bei jeder Datenabfrage auf die aktuelle Zeit geupdatet wird.
ZB. static Date lastDatenAbfrage;
Zusätzlich speicherst du die Abgefragten und geparsten Daten in ein static Datenfeld, damit alle Servlets drauf zugreifen können.
Nach der Ausgabe von deinem Servlet startest du den Zugriff auf den Server - Allerdings nur, wenn die letzte Datenabfrage mindestens 20 Sekunden alt ist.
ZB.
Date currentDate = new Date();
long mindestZeitabstandInMs = 20*1000; // 20 Sekunden
if (currentDate().getTime()-mindestZeitabstandInMs > lastDatenAbfrage.getTime()) {
// Super tolle Serverabfrage
// Ergebnis parsen
// Ergebnis in static Datenfeld schreiben
}
Jetzt hast du nur noch einen Sonderfall: Beim allerersten Aufruf des Servlets hast du keine Daten in deinem static Datenfeld. Dh. Entweder schreibst du dann „Bitte warten, Reload drücken“ oder du befüllst das Datenfeld in deiner Init-Methode mit Default-Daten.
…außerdem ist der Thread
statisch, wie Du es vorgeschlagen hattest. Damit dürfte
maximal ein Thread pro Servletinstanz laufen, evtl. sogar nur
einer (weil statisch)? Das hab ich noch nicht so recht
begriffen.
Uhuh - Bitte sei da Vorsichtig - Ich habe statische Variablen und nicht statische Threads gemeint. Statische Variablen sind eines der zentralen Konzepte von Java: Bitte schau dir das unter http://java.sun.com/docs/books/tutorial/java/javaOO/… nochmal an.
Nur kurz zu dem, was ich meine: Wenn du eine normale Variable in einer Klasse definierst, dann ist diese jeweils an die Instanz gebunden. Dh. Jede Instanz einer Klasse (Also in deinem Fall jedes von Tomcat instanzierte Servlet deiner Servletklasse) hat eine eigene Variable.
Wenn du die Variable als static deklarierst, ist sie an die Klasse selber gebunden. Dh. Jede Instanz / Jedes Servlet der Klasse hat einfach nur einen „Zeiger“ auf die eine globale Variable.
Kleines Beispiel:
public class BooNormal {
String value = „“;
}
a = new BooNormal();
b = new BooNormal();
a.value = „1“;
b.value = „2“;
a.value enthält jetzt „1“ und b.value enthält „2“, da die beiden Variablen jeweils an die Instanz gebunden und somit unabhängig sind.
Jetzt static:
public class BooStatic {
static String value = „“;
}
a = new BooStatic();
b = new BooStatic();
a.value = „1“;
b.value = „2“;
a.value zeigt auf den gleichen Speicherplatz wie b.value - Dh. a.value = b.value = „2“.
Auf diesem Weg kannst du zwischen verschiedenen Instanzen einer Klasse (Also den einzelnen von Tomcat instanzierten Instanzen deines Servlets) Daten direkt ausstauschen.
Habe gelesen, das man den Tomcat konfigurieren
kann, ob er mehrer Instanzen eines Servlets erstellen soll und
unter welchen Bedingungen er das macht usw.
Ja - Man sollte eigentlich immer selber konfigurieren, was man haben will. Standardmäßig Instanziert Tomcat mehrere Instanzen pro Servlet, damit er auch mehrere gleichzeitige Requests abhandeln kann. Schau dir mal den Bereich in der Beschreibung der web.xml an. In dieser Datei (Sie liegt normalerweise im Verzeichnis WEB-INF) sollten alle Servlets eingetragen und konfiguriert werden. Sonst nimmt die Servlet-Engine (Tomcat) grundsätzlich immer Defaultwerte.
Vielen Dank nochmal für Deine Hilfe.
np
Gruß Bonkers
mfG,
J.P.Jarolim