Zitat Zitat von KM
Wenn ich nun aber die DTAQ über die destroy()-Methode des Servlets beschicke, dann wird zwar der Thread beendet, aber der DTAQ-Server (QZHQSSRV) bleibt aktiv.
Werden da dann beide(!) AS/400-Verbindungen (1x Dienst, 1x dein "Destroyer") geclosed? Teste einmal ob es was bringt, wenn du etwas wartest (ein paar Sekunden sleep).

Zitat Zitat von KM
Ich hab's auch schon mit as400.disconnectAllServices() versucht. Hat aber nichts gebracht.
Wie gesagt, schließt nur die Verbindung für das Objekt as400 - aber du hast da mindestens 2 davon.

Zitat Zitat von KM
Wie kann ich denn nun über das Servlet den Thread sauber beenden, so dass auch die Server auf der iSeries wieder freigegeben werden ? Ich hab's auch mal mit thread.stop() versucht, was man ja eigentlich nicht machen sollte. Aber da wird das Objekt thread nicht gefunden (Cannot resolve symbol), weil es ja in der init()-Methode instanziiert wurde.
Variante 1:
Die Deklaration von Thread wandert noch oben und gilt für die ganze Klasse. Damit erreichst du es dann auch beim destroyed().

Variante 2:
nach dem Starten:
Code:
thread.start();      getServletContext().setAttribute("dienst", thread);
und wieder holen mit:
Code:
Thread thread = (Thread) getServletContext().getAttribute("dienst");
Ich bin mir allerdings nicht sicher ob thread.stop() dein Problem löst. Sauber wäre wohl thread.interrupt() (ev. mit Zeit) und die InterruptExeception (beim Dataqueue.read im Dienst) abfangen und ein sauberes Ende einleiten.

Eine einfache Lösung ist auch den Thread als daemon zu setzen:

also vor dem thread.start() noch ein:
thread.setDaemon(true);

Damit wird der Thread mit dem Servlet beendet - ich denke das auch hier die InterruptExecption behandelt werden muss.

Nachzulesen im angeführten Link unter Threads in Servlets Abschnitt "Background Threads", Source dazu ist ganz unten.

http://www-i3.informatik.rwth-aachen...em-threads.pdf