Re: [Hbci4java-help] Multithreading in WebApp (Tomcat)
Brought to you by:
kleiner77
|
From: HBCI4Java (S. Palme) <hbc...@ka...> - 2010-07-28 06:41:09
|
Hallo Claudia,
HBCIUtils.init() muss/sollte nur genau EINMAL aufgerufen werden, um zwar
am besten während der Erzeugung des Servlets.
Innerhalb jeder zusätzlichen ThreadGroup muss dann nur noch
HBCIUtils.initThread() aufgerufen werden.
Die von Dir gezeigte Exception deutet jedenfalls darauf hin, dass für
die aktuelle ThreadGroup noch kein HBCIUtils.initThread() aufgerufen
wurde.
Der Einsatz von HBCI4Java in einer Web-Applikation, so wie Du es planst,
ist derzeit noch etwas schwierig. Konkret gibt es dabei u.a. folgendes
zu beachten:
1) Der App-Server behandelt jeden Request ja in einem separaten Thread -
es können also u.U. mehrere Threads parallel laufen. Für MultiThreading
in HBCI4Java werden aber mehrere verschiedene Thread-GROUPS benötigt.
Normalerweise packt ein App-Server aber alle Request-Threads in die
SELBE ThreadGroup, so dass es nicht reicht, für jeden Request einfach
HBCIUtils.initThread() aufzurufen. Statt dessen musst Du selbst für
jeden Request eine neue ThreadGroup erzeugen, darin einen neuen Thread,
und diesen dann mit HBCIUtils.initThread() initialisieren und darin dann
die HBCI4Java-Funktionen nutzen.
2) Falls Dein HBCI-Dialog über mehrere HTTP-Request/Response-Paare
verteilt ist (z.B. weil Du während des HBCI-Dialoges noch eine Rückfrage
nach einer PIN oder TAN ausführen musst), besteht das Problem, dass der
HTTP-Request mit der "Antwort" (also z.B. der TAN) ja ein neuer
HTTP-Request ist, der wiederum vom App-Server in einem neuen Thread
behandelt wird. Um aber den ursprünglichen HBCI-Dialog - der ja gerade
"wartet" - weiterlaufen zu lassen (mit handler.continueThreaded()),
musst Du aber erst wieder in die ThreadGroup wechseln, in der Du diesen
HBCI-Dialog gestartet hast...
Alles in allem ist das ein ziemlich hässliches hin- und her-Geschiebe
von Thread-/ThreadGroup-Objekten... Je nachdem, was Deine Anwendung
konkret leisten soll, kann man diese Probleme evtl umgehen, indem man
mit nur EINEM HBCI-Thread arbeitet und eine "Queue" einrichtet, die
permanent von diesem HBCI-Thread abgearbeitet wird (seriell). Die
einzelnen HTTP-Requests füllen nur diese Queue und machen selbst gar
kein HBCI, sondern warten einfach nur darauf, dass das jeweilige
Ergebnis irgendwann mal vom HBCI-Thread bereitgestellt wird...
Diese unschöne Geschichte mit den ThreadGroups wird es in HBCI4Java-3
übrigens auch nicht mehr geben...
Gruß!
-stefan-
On Tue, 2010-07-27 at 12:20 +0200, M H wrote:
> Hallo,
>
> ich möchte das HBCI4Java-Framework in eine Webanwendung (Servlet)
> einbinden in der zu einem Zeitpunkt mehrerer Anfragen für
> unterschiedliche Passports kommen können.
>
> Allerdings ist mir bis jetzt nur das verarbeiten von einzelnen
> Anfragen gelungen Wie muss ich ein HbciHandle/-Passport initialisieren
> das multithreadingfähig ist?
>
> Aktuell tue ich folgendes:
>
> Init Methode:
> HBCIUtils.initThread(passportProperties, hbciCallback);
> HBCIUtils.init(passportProperties, hbciCallback);
>
> HBCIPassport passport = AbstractHBCIPassport.getInstance();
> hbciHandle = new HBCIHandler("plus", passport);
>
>
> execute Methode:
> HBCIExecThreadedStatus status = this.executeThreaded();
>
> if (status.isFinished()) {
>
> Ergebnis auswerten ...
> }
>
>
> aufräumen Methode:
>
> HBCIUtils.doneThread();
>
>
> Wie gesagt für einzelne Anfragen funktioniert das wunderbar! Bei
> parallelen Anfragen bekomme ich die Exception:
>
> Exception in thread "Thread-19" java.lang.NullPointerException
> at
> org.kapott.hbci.manager.HBCIUtilsInternal.getLocMsg(HBCIUtilsInternal.java:89)
> at
> org.kapott.hbci.manager.HBCIUtilsInternal.getLocMsg(HBCIUtilsInternal.java:99)
> at
> org.kapott.hbci.manager.HBCIUtilsInternal.getLocMsg(HBCIUtilsInternal.java:94)
> at org.kapott.hbci.manager.HBCIUtils.getParam(HBCIUtils.java:847)
> at org.kapott.hbci.manager.HBCIUtils.log(HBCIUtils.java:979)
> at org.kapott.hbci.manager.HBCIHandler$1.run(HBCIHandler.java:502)
>
>
>
> Gibt es irgendwo Beispielcode oder könnt Ihr mir mit einem Tipp
> helfen?
>
>
> Danke und Gruß,
> Claudia
|