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 |