Thread: Re: [Hbci4java-help] [Bug 84] Probleme, wenn Threads nicht selbst erzeugt werden (bei Tomcat etc .)
Brought to you by:
kleiner77
|
From: <ro...@we...> - 2009-02-24 13:00:55
|
> -----Ursprüngliche Nachricht----- > Von: "HBCI4Java (Stefan Palme)" <hbc...@ka...> > Gesendet: 18.02.09 00:02:15 > An: ro...@we... > CC: hbci4java-help <hbc...@li...> > Betreff: Re: [Bug 84] Probleme, wenn Threads nicht selbst erzeugt werden (bei Tomcat etc .) > Hi, > > > > ich antworte mal direkt per Mail, denn 'ne Diskussion im Bugzilla > > > halte ich nicht für soo sinnvoll :) > > > > Das ist Ansichtssache, im Bugtracker könnten evtl. auch andere > > mitdiskutieren, wie in einem Diskussionsforum. Fänd ich gar nicht so > > blöd. > > Aber ich bin da ganz flexibel :) > > Wenn überhaupt dann Mailing-Liste. Diskussionen im BugTracker werden > die wenigsten überhaupt wahrnehmen, wenn ein bestimmter Bug sie nicht > selbst betrifft :) Zunächst: Sorry für meine späte Antwort, aber meine letzten Tage waren ziemlich hektisch. Aber mittlerweile ist das Leben wieder unter Kontrolle :) > Ich starte mal ein CC an die Liste, die Diskussion begann bei > diesem Bug: > https://bugzilla.kapott.org/show_bug.cgi?id=84 Alles klar, ich hab mich mittlerweile auch in die Liste eingetragen. Ist vermutlich wirklich besser geeignet als der Bugtracker. Ich hatte die Liste noch gar nicht so mit Bewusstsein wahrgenommen ... > > Ansonsten muss ich gestehen, dass mir noch gar nicht in den Sinn > > gekommen ist, dass ein Anwendungsprogramm die Möglichkeit hat/haben > > könnte, eine eigene HBCIPassportFactory oder einen eigenen > > HBCIPassport zu implementieren. Mir ist derzeit auch nicht klar, warum > > bzw. wann das nötig sein sollte, aber vielleicht gibt es derartige > > Situationen. > > Diese Erweiterbarkeit ist eines der am häufigsten verwendeten > "Special-Features" von HBCI4Java. > > [...] > > Mit etwas Fleiß könnte ich eine ganze Menge derartiger Beispiele > aufzählen, was der Grund dafür ist, dass ich bestimmte Features > von HBCI4Java auch weiterhin nicht fest in der Lib verdrahten will, > sondern über einen Factory- oder Plugin-Mechanismus dynamisch > erweiterbar halten will. Achso. Das ist gut zu wissen. Ich hätte nicht damit gerechnet, dass die entsprechenden Erweiterungsmöglichkeiten tatsächlich so rege eingesetzt werden, jetzt leuchtet mir auch ein, warum der Erweiterbarkeit an dieser Stelle so viel Aufmerksamkeit zuteil wird. Evtl. wäre ein Dokument nützlich, dass genau das beschreibt, was du hier in dieser Mail beschreiben hast. Dann versteht man besser, warum alles so ist, wie es ist. Es gibt zwar schon viel und auch gut verständliche Doku, aber die beschreibt eigentlich nie, warum die Architektur der Library so ist, wie sie ist, und wie es dazu gekommen ist. > Ich gebe Dir natürlich insofern Recht, dass solche Sachen wie > die HBCI-Datentypen (numerisch, alphanumerisch, binary, ...) > nicht über eine von außen erweiterbare Factory instanziiert werden > müssen, denn wenn das notwendig wäre, würde man mit eigenen > Implementierungen wohl mehr Schaden anrichten als alles andere > (im Moment wäre aber sogar das möglich - aber das ist nur ein > Nebeneffekt des Software-Designs an dieser Stelle und keine "Absicht"). Klar, das ergibt sich aus dem Design quasi von alleine. > > Ich hatte mir das ganze bisher eher so vorgestellt, dass alle > > Factories, Passports, der Kernel etc. von HBCI4Java bereitgestellt > > werden, und vom Anwendungsprogramm nur > > konfiguriert/instantiiert/benutzt werden. > > Das scheint mir auch ausreichend zu sein, wenn mit den vorhandenen > > HBCI4Java-Klassen der HBCI-Standard abgedeckt wird. Falls jemand noch > > Lücken entdeckt, also etwas, was HBCI4Java können sollte, aber nicht > > kann, wäre es vermutlich besser, um eine Aufnahme des zusätzlichen > > Codes in das offizielle HBCI4Java-Repository zu bitten, anstatt im > > Anwendungsprogramm Teile der HBCI-Implementierung unterzubringen. > > Natürlich. Bei den Möglichkeiten zur Erweiterbarkeit ging es primär > auch nicht darum, HBCI4Java tatsächlich um HBCI-Funktionalitäten > erweitern zu können. Allerdings gebe ich zu, dass ich ursprünglich die > Vorstellung hatte, dass ich mit HBCI4Java nur das Framework und > einige Basis-GVs liefere und die oft zitierte "Community" z.B. weitere > Implementierungen von Geschäftsvorfällen beisteuert. > > Technisch wäre das bis zu einem gewissen Zeitpunkt möglich gewesen, > allerdings hatte wohl gerade niemand Zeit, sich damit zu > beschäftigen ;-) > > Diese "Erweiterungen" sollten auch nicht verstanden werden als > "im Anwendungsprogramm Teile der HBCI-Implementierung unterzubringen", > sondern vielmehr tatsächlich als "Aufsatz" auf HBCI4Java, der z.B. > Unterstützung für weitere Geschäftsvorfälle, alternative Speicher- > Medien für Passports (Datenbanken, RPC-Services...) usw. liefern. Achso. Das heißt dann also, dass man eine Kapselung hat, die man so beschreiben könnte: User <-> Anwendungsprogramm <-> HBCI4Java-Aufsatz <-> HBCI4Java <-> Banksysteme Warum auch nicht, ich würde nur behaupten, dass es immer eine Trennung zwischen dem Anwendungsprogramm und dem HBCI4Java-Aufsatz geben sollte. Dann wären die Verantwortlichkeiten weiterhin klar definiert. > (Ich vermute, dass z.B. in Hibiscus einige HBCI4Java-Klassen und/oder > -Methoden überschrieben wurden, um spezielle Funktionalitäten > einzubringen...) > > > ... > > Wenn man diese Kapselung so einhalten würde, bräuchte man -wenn ich > > das richtig verstanden habe- gar keine Factory, man könnte Objekte der > > einzelnen Klassen einfach normal instantiieren und nutzen. > > Das hätte aber genau den Nachteil, dass die HBCI4Java-Bibliothek > nur die Klassen benutzen kann, von denen sie zur Entwicklungszeit > bereits weiß. Sprich: eigene Passport-Speicher-Implementierungen, > eigene Hilfsklassen für Geschäftsvorfälle usw. wären nicht mehr > möglich. Nun, man müsste dann halt die HBCI4Java-Bibliothek selbst kompilieren, damit diese zur Compilezeit alle zusätzlichen Klassen kennen. Sollte meiner Meinung nach auch kein Problem darstellen, aber ich weiß nicht, ob die Autoren der vorhandenen Erweiterungen das auch so sehen. Ich persönlich sehe es nicht also sonderlich großes Problem an, zumal ja viele Entwicklungsumgebungen wie Eclipse auch mehrere Projekte gleichzeitig verwalten können. In dem Fall wäre es evtl. auch einfacher, die entstandenen Klassen HBCI4Java selbst zukommen zu lassen (damit auch andere was davon haben). Aber evtl. hätte das Nachteile, die mir noch nicht klar sind. > > Ganz grob so in diesem Stil: > > [pseudocode] > > // Pro Thread, vor der ersten Kommunikation mit der Bank > > HBCICore core = new HBCICore(locale, loglevel, shadelevel, callback, > > options); > > HBCIPassport passport = new HBCIPassport(passporttype, > > passportFilename); > > HBCIHandler handler = new HBCIHandler(core, passport, hbciVersion); > > // core, passport und handler sind jetzt normale Instanzen der > > Klassen, die zerstört werden können > > > > // irgendwann ... (nur für den aktuellen Thread) > > handler.close(); > > passport.close(); // Passportdatei wird natürlich geschrieben und > > geschlossen > > core.close(); // Nur die eigene Instanz des Core > > core = null; // RAM freischaufeln > > passport = null; // RAM freischaufeln > > handler = null; // RAM freischaufeln > > [/pseudocode] > > Das Problem dabei sind z.B. Anwendungen, die in einem Application- > Server laufen und HBCI-PIN/TAN via iTAN oder einem anderen Zweischritt- > Verfahren machen. > > Denn dabei MUSS der HBCI-Dialog zunächst gestartet werden. WÄHREND > der Dialog-Ausführung wird vom HBCI-Server nach einer bestimmten TAN > gefragt - diese Frage muss an den Nutzer weitergereicht werden. > > Dabei entsteht also ein neues Response (mit der Rückfrage nach der > richtigen TAN) sowie ein neuer Request (mit dem der Nutzer die > TAN liefert). Der neue Request des Nutzers muss die gelieferte TAN > natürlich für den "alten" HBCI-Dialog verwenden, so dass man hier > eine Kopplung im Sinne von "Sessions" braucht. > > Und damit wird es schon nicht mehr so einfach wie es in > Deinem Pseudocode aussieht ;-) Hmm, man kann das noch weiterspinnen, indem der User sogar zunächst danach gefragt wird, welchen TAN-Typ er verwenden möchte (es kann ja mehrere geben), danach würde dann z. B. bei iTANs der TAN-Index abgerufen werden, etc. Oder der User kann sogar interaktiv arbeiten, mit weiteren Zwischenschritten. Halt je nachdem, was im spezifischen Fall genau gewünscht ist. Sollte aber meiner Meinung nach kein Problem sein, weil ja eine Sitzungsverwaltung in dem Szenario ohnehin notwendig ist. Der Application-Server muss also für den User eine Session erzeugen, daraufhin kann der User im Rahmen dieser Sitzung mit dem Server arbeiten, und der Server kann jede Anfrage jedes Benutzers einer Sitzung zuordnen. Dadurch kann der Server dann auch z. B. für einen konkreten User eine Kommunikation mit der Bank durchführen. Letztlich können ja die erzeugten Objekte so lange im Arbeitsspeicher verbleiben, wie die Session des Users existiert. Das würde ich aber nicht als Verantwortlichkeit der Library ansehen, sondern als Verantwortlichkeit der Anwendung, die die Library nutzt. Die Library sollte ja möglichst flexibel einsetzbar sein, wobei ich es am saubersten finden würde, wenn die Library selbst möglichst wenig State enthält, und die Anwendung sich darum kümmert. Wenn man das nicht so macht, müsste die Library ja quasi eine eigene Sitzungsverwaltung machen. Das hätte dann aber wieder den Nachteil, dass der Application-Server ja evtl. noch viel mehr bereitstellt, als nur die Funktionalität der HBCI-Libray, daher wird dieser typischerweise eine eigene Sitzungsverwaltung brauchen. Man müsste also eine Sitzung aus Sicht der Library mit einer Sitzung aus Sicht des Servers miteinander verknüpfen, und das scheint mir recht umständlich. Da wäre es doch einfacher, wenn der Server die Sitzung verwaltet und den State enthält, und die Library möglichst wenig State enthält. Dabei würde ich aber davon ausgehen, dass der Server für alle User und alle Threads den gleichen Code verwenden will, daher können die Factories wohl auf jeden Fall alle global sein. Falls es tatsächlich gewünscht sein sollte, dass nicht alle Features für alle User zur Verfügung stehen, könnte der Server ja entscheiden, welcher User was genau darf. Dies ist ganz sicher nicht Sache der Library. > > ... Ich denke aber nicht, dass man Factories pro Thread verwalten > > müsste, das dürfte wohl nichts bringen. > > Das denke ich allerdings auch. Der aktuelle HBCI4Java-3-Code ist auch > so ausgelegt, dass Factories tatsächlich "global" sind und nicht pro > Thread oder HBCI-Session differenziert werden können. Full ACK von mir :) > > Falls man wirklich zusätzliche Passports oder dergleichen benötigt, > > kann man diese ja beim Programmstart an der Library registrieren. > > Danach könnten diese für alle Threads zur Verfügung stehen, die diesen > > Typ benötigen. Da ja jeder Passport-Typ einen eindeutigen Namen haben > > muss, sind ja Verwechslungen ausgeschlossen. > > So ist der derzeitige Stand der Dinge. Nur dass keine zusätzlichen > Klassen "registriert" werden (in engerem Sinne). Statt dessen hat > eine Anwendung einfach die Möglichkeit, die von HBCI4Java verwendete > Factory durch eine eigene Factory-Implementierung zu ersetzen (siehe > mein vorheriges Mail mit dem Code-Beispiel). Ja, das meine ich eigentlich - hab mich etwas unglücklich ausgedrückt ... > > Aber was meiner Meinung nach pro Thread verwaltet werden sollte: > > -> Einstellungen, die direkt die Usability betreffen (z. B. die zu > > verwendende Sprache/Locale) > > ACK. > > > -> Alle Einstellungen zur Kommunikation mit der Bank (BLZ, Host, Port, > > Filter, UPD, BPD, unterstützte Securitymechanismen, etc.) > > Sowieso. Die Verwendung von globalen Variablen zur Konfiguration > von Passports war design-technisch ein grober Fehler, an den man sich > über die Jahre wohl gewöhnt hat :) > > > -> Callback-Objekte > > Hier wäre schon wieder die Frage, ob das tatsächlich notwendig ist. > Man könnte einerseits natürlich pro HBCI-Session individuelle > Callback-Objekte registrieren. > > Andererseite könnte man jedem Callback-Aufruf ja auch einfach einen > Parameter "HBCISession session" mitgeben, der sämtliche session- > relevanten Daten enthält, so dass auch EIN Callback-Objekt in > verschiedenen HBCI-Sessions unterschiedlich agieren könnte. Hmm, hier ist wieder die Frage, wie und wo der State verwaltet wird. Meine Meinung ist ja die, dass die Anwendung den State verwalten sollte, und diese würde natürlich gerne jedes Objekt, das im Rahmen einer Session mit einem Benutzer angelegt wird, später wieder zerstören (spätestens, wenn die Session abgelaufen ist). Hierbei wäre es natürlich schön, wenn auch das Callback-Objekt immer einer bestimmten Session zugeordnet wäre, dann könnte man auch dieses zerstören, sobald die Session abgelaufen ist. Außerdem ist es ja immer kritisch, wenn ein Objekt von mehreren Sessions gleichzeitig verwendet wird, denn dann muss man sich immer über Synchronisierung Gedanken machen. Wenn jedes Objekt im Arbeitsspeicher immer einer bestimmten Session zugeordnet ist, hat man damit schon mal keine Probleme. Außerdem können so mehrere Threads gleichzeitig arbeiten, ohne dass es Performanceengpässe geben kann. Wenn eine Methode "synchronized" ist, müssen ja die Threads aufeinander warten, die (evtl. vorhandenen) mehreren CPUs bzw. Kerne können somit nicht so gut ausgereizt werden. Auch für Anwendungen, mit denen immer nur ein Anwender arbeitet, wäre das kein Nachteil, denn letztlich können die Objekte (z. B. das Callback-Objekt) ja auch einfach so lange bestehen bleiben, bis das Programm beendet wird. Falls tatsächlich gewünscht, könnte eine Anwendung ja auch einfach für jede Sitzung immer wieder eine Referenz auf das gleiche Callback-Objekt übergeben, und so tatsächlich immer wieder dieses eine Callback-Objekt benutzen, das wäre ja weiterhin möglich (nur müsste natürlich jeder Callback die HBCISession als Parameter mitbekommen). Aber ich könnte mir vorstellen, dass das eigentlich kaum genutzt wird, getrennte Objekte scheinen mir so viel schöner ... > Zumindest ist das der gegenwärtige Stand der Entwicklung... > > > Allgemein gesprochen, halte ich es für "vergebliche Liebesmühe", > > HBCI4Java daraufhin zu optimieren, dass man es durch eigenen Code > > erweitern kann, der dann von HBCI4Java genutzt wird, dies ist > > vermutlich wenig relevant... > > Siehe Anfang mein Mail - da irrst Du Dich :) Ja, ist mir mittlerweile klar geworden :) > > In der Praxis dürfte es viel eher nützlich sein, wenn mehrere > > Transaktionen mit mehreren verschiedenen Banken exakt parallel laufen > > können, ohne dass die Gefahr besteht, dass diese sich gegenseitig > > stören oder beeinflussen. > > Das ist ebenfalls ein wichtiger Punkt, der in HBCI4Java-2 schon > einigermaßen gut unterstützt wurde, allerdings leider erst > "nachträglich", was zu diversen Kompromisslösungen geführt hat > (Du hast das bereits gut erkannt).. > > HBCI4Java-3 wird an dieser Stelle wohl etwas sauberer sein... Das halte ich für sehr lohnenswert, weil dadurch manche Szenarien besser unterstützt werden, und es eigentlich für niemanden Nachteile gibt. Gibt es eigentlich schon eine Art "Roadmap" für die 3er Version, oder ist noch nicht klar, wie lange es ganz grob noch dauern wird? > Viele Grüße > -stefan- Viele Grüße, Rolf |
|
From: Rolf V. <ro...@we...> - 2009-02-24 18:36:52
|
> -----Ursprüngliche Nachricht----- > Von: "Olaf Willuhn" <hbc...@wi...> > Gesendet: 24.02.09 14:50:19 > An: hbc...@li... > Betreff: Re: [Hbci4java-help] [Bug 84] Probleme, wenn Threads nicht selbst erzeugt werden (bei Tomcat etc .) > Hi, > > > Es gibt zwar schon viel und auch gut verständliche Doku, aber die > > beschreibt eigentlich nie, warum die Architektur der Library so ist, wie > > sie ist, und wie es dazu gekommen ist. > > Wie das immer so ist mit Doku: Irgendwo wuerde man sich immer > noch mehr wuenschen ;) Ja, das ist wahr. Wobei HBCI4Java IMHO schon recht gut dokumentiert ist, daher bitte nicht als Kritik mißverstehen :) > > Achso. Das heißt dann also, dass man eine Kapselung hat, die man so > > beschreiben könnte: > > > > User <-> Anwendungsprogramm <-> HBCI4Java-Aufsatz <-> HBCI4Java <-> > > Banksysteme > > > > Warum auch nicht, ich würde nur behaupten, dass es immer eine Trennung > > zwischen dem Anwendungsprogramm und dem HBCI4Java-Aufsatz geben sollte. > > Dann wären die Verantwortlichkeiten weiterhin klar definiert. > > Ich sehe von "HBCI4Java-Aufsatz" jetzt nicht so ganz den Sinn. > Es sei denn, man betrachtet "HBCI4Java" als _ein_ moegliches > Payment-Backend, falls man neben HBCI noch andere Protokolle > unterstuetzen moechte. Das ist wahr, wenn man das von Vorneherein ausschließen will/kann, ist die klare Trennung an der Stelle vermutlich "Overkill". Letztlich kann es wohl nur im Ermessen der Entwickler der Anwendung liegen, wie die ihre Softwarearchitektur aufbauen. Aber falls evtl. (von Anfang an oder auch erst später) andere Möglichkeiten in Betracht gezogen werden, würde ich persönlich schon den oben skizzierten Aufbau wählen. Aber wie geschrieben, das ist wohl Sache der Entwickler der Anwendung, und hat nur noch peripher mit der Library selbst zu tun. > > Nun, man müsste dann halt die HBCI4Java-Bibliothek selbst kompilieren, > > damit diese zur Compilezeit alle zusätzlichen Klassen kennen. > > Das wuerde aber implizieren, dass jede Anwendung ihre eigene > Version von HBCI4Java mitbringt. Fuer OpenSuSE aber gibt es > HBCI4Java z.Bsp. als RPM (http://packman.links2linux.de/package/hbci4java), > welches als Abhaengigkeit von mehr als einem Paket verwendet wird. Ahso, daran hatte ich überhaupt noch nicht gedacht. Wobei ich es nicht als Nachteil ansehen würde, wenn jede Anwendung ihre eigene Version mitbringt, denn: 1.: Könnte so der Entwickler der Anwendung sicherstellen, dass die vorhandene Version von HBCI4Java zur Anwendung auch wirklich kompatibel ist, und dann diese definitiv kompatible Version einfach mitinstallieren lassen. 2.: Könnte der Entwickler der Anwendung so seine Erweiterungen einfach in seine Instanz der Library eincompilieren, und wäre beliebig flexibel (beliebige Änderungen wären möglich, sofern sinnvoll). 3.: Dürfte ein typischer Anwender vermutlich nur ein Programm auf seinem Rechner installieren, dass HBCI4Java nutzt. Falls er tatsächlich mehrere Programme installiert, dürfte der sehr geringe Mehrbedarf an Speicherplatz nicht ins Gewicht fallen. Aber gut, das ist letztlich Ansichtssache, und lässt sich vermutlich nachträglich nicht mehr sonderlich gut umentscheiden. Ich bin schon länger der Meinung, das shared libraries in vielen Fällen mehr schaden, als nutzen, und dass es oftmals einfacher ist, wenn eine Software ihre Libraries einfach selbst mitbringt (unabhängig vom Betriebssystem) - ausgenommen natürlich Libraries, die fast jedes Programm benötigt, und die tatsächlich dutzendfach im System vorhanden wären. Das würde vieles vereinfachen (keine Versionskonflikte mehr), und der zusätzliche Speicherplatzbedarf dürfte 99% aller User nicht wirklich interessieren. Aber gut, diese Diskussion ist wahrscheinlich für diese Mailingliste schon leicht "off topic", daher sollten wir das wohl nicht vertiefen. Es spricht ja auch nichts dagegen, den bisherigen Mechanismus mit den Factories beizubehalten, ich war nur irrtümlich davon ausgegangen, dieser wäre eigentlich unnötig und würde nicht real genutzt werden. Wenn dem so gewesen wäre, hätte man ihn in der nächsten Version einfach weglassen können. > > Hmm, man kann das noch weiterspinnen, indem der User sogar zunächst danach > > gefragt wird, welchen TAN-Typ er verwenden möchte (es kann ja mehrere > > geben), danach würde dann z. B. bei iTANs der TAN-Index abgerufen werden, > > etc. Oder der User kann sogar interaktiv arbeiten, mit weiteren > > Zwischenschritten. Halt je nachdem, was im spezifischen Fall genau > > gewünscht ist. > > Das ist doch mittels HBCICallback bereits so. Oder meinst du > etwas anderes? Der HBCICallback ist ohne Probleme dazu in der Lage, beliebig viele Interaktionsschritte mit dem Anwender durchzuführen, das ist auf jeden Fall klar. Ich würde es nur schön finden, wenn die Library pro Session ein _eigenes_ Callbackobjekt verwaltet, damit mehrere Sessions sich nicht ein einziges derartiges Objekt teilen müssen. Dazu muss am Callbackmechanismus nicht wirklich viel geändert werden, da ja jetzt schon pro ThreadGroup ein eigenes Objekt verwaltet wird. Ein derartiges _gemeinsames_ Callback-Objekt hat Stefan aber für die nächste Version der Library geplant, ich denke jedoch, dass das keine so gute Idee wäre. Es hätte für manche Szenarien Nachteile, im Gegenzug scheint es mir jedoch keine Vorteile zu geben. Mein Vorschlag wäre weiterhin, den Session-Identifier von außen (also durch die Anwendung) festzulegen, und nicht mehr auf die ThreadGroup zu schauen. Im Moment findet eine Trennung von Sessions ja immer anhand der ThreadGroup statt, hier wäre es einfach besser, die Trennung anhand eines Merkmals zu haben, dass die Anwendung vorgibt. Das kann ja evtl. auch die ThreadGroup sein, aber oftmals wird das irgendeine SessionId sein. Wäre auf jeden Fall besser, wenn die Library selbst _nicht_ auf die ThreadGroup zugreift, denn das geht halt nur, wenn das Anwendungsprogramm selbst seine Threads erzeugt. Wenn z. B. ein Application-Server wie Tomcat die Threads erzeugt, geht das nicht. Dann _muss_ das Merkmal zur Trennung der Sessions von außen an die Library übergeben werden. Kurz zusammengefasst meine Vorschläge, nachdem ich jetzt meine falschen Vorstellungen losgeworden bin: -> Bisheriger Mechanismus mit Factories, die von der Anwendung überschrieben werden können, sollte beibehalten werden, weil dieser (entgegen meinen Vermutungen) rege genutzt wird. -> Aufbau der Anwendung ("HBCI4Java-Aufsatz" als klar getrenntes Modul oder mit dem restlichen Code vermischt) kann wohl nur von den Entwicklern der Anwendung sinnvoll entschieden werden. -> Ein einziges Callback-Objekt für alle Sessions, die evtl. parallel ablaufen, erscheint mir keine gute Idee, getrennte Callback-Objekte haben diverse Vorteile und keine Nachteile. -> Die Factories können wohl ohne weiteres global von der Library verwaltet werden, aber sonst sind meines Erachtens nach globale Variablen bzw. Datenstrukturen potentiell schlecht für Performance und Stabilität, und somit keine gute Idee. Schon alleine, weil synchronized-Methoden keine gleichzeitige Abarbeitung zulassen. Besser ist praktisch immer ein Objekt pro Session, egal ob das Objekt von der Anwendung oder von der Library instanziiert wird. -> Der Session-Identifier sollte von der Anwendung bereitgestellt werden, weil diese vermutlich sowieso einen solchen verwaltet (sofern die Anwendung mehrere gleichzeitige Sessions benötigt -- falls nicht, kann hier ja einfach ein fixer Wert übergeben werden). ThreadGroups sind wenig geeignet, weil diese nicht verwendet werden können, wenn die Anwendung ihre Threads nicht selbst erzeugt. > Gruss > Olaf Viele Grüße, Rolf |
|
From: Olaf W. <hib...@wi...> - 2009-02-24 23:10:38
|
Hi, > > Das wuerde aber implizieren, dass jede Anwendung ihre eigene > > Version von HBCI4Java mitbringt. Fuer OpenSuSE aber gibt es > > HBCI4Java z.Bsp. als RPM > > (http://packman.links2linux.de/package/hbci4java), welches als > > Abhaengigkeit von mehr als einem Paket verwendet wird. > > Ahso, daran hatte ich überhaupt noch nicht gedacht. Wobei ich es nicht als > Nachteil ansehen würde, wenn jede Anwendung ihre eigene Version mitbringt, Ich finde es ja auch einfacher, wenn jede Anwendung ihre eigenen Libs mitbringt. Weil man sich dann einfach nicht um die Abhaengigkeiten der anderen kuemmern muss. Die Paketmaintainer der Distributionen legen aber grossen Wert darauf, Komponenten wiederzuverwenden ;) Gruss Olaf |
|
From: Stefan P. <kl...@ho...> - 2009-02-25 13:16:39
|
Hi, > > > Nun, man müsste dann halt die HBCI4Java-Bibliothek selbst kompilieren, > > > damit diese zur Compilezeit alle zusätzlichen Klassen kennen. > > > > Das wuerde aber implizieren, dass jede Anwendung ihre eigene > > Version von HBCI4Java mitbringt. Fuer OpenSuSE aber gibt es > > HBCI4Java z.Bsp. als RPM (http://packman.links2linux.de/package/hbci4java), > > welches als Abhaengigkeit von mehr als einem Paket verwendet wird. > > > Ahso, daran hatte ich überhaupt noch nicht gedacht. Wobei ich es nicht als Nachteil ansehen würde, wenn jede Anwendung ihre eigene Version mitbringt, denn: > 1.: Könnte so der Entwickler der Anwendung sicherstellen, dass die vorhandene Version von HBCI4Java zur Anwendung auch wirklich kompatibel ist, und dann diese definitiv kompatible Version einfach mitinstallieren lassen. > 2.: Könnte der Entwickler der Anwendung so seine Erweiterungen einfach in seine Instanz der Library eincompilieren, und wäre beliebig flexibel (beliebige Änderungen wären möglich, sofern sinnvoll). > 3.: Dürfte ein typischer Anwender vermutlich nur ein Programm auf seinem Rechner installieren, dass HBCI4Java nutzt. Falls er tatsächlich mehrere Programme installiert, dürfte der sehr geringe Mehrbedarf an Speicherplatz nicht ins Gewicht fallen. > > Aber gut, das ist letztlich Ansichtssache, und lässt sich vermutlich nachträglich nicht mehr sonderlich gut umentscheiden. Ich bin schon länger der Meinung, das shared libraries in vielen Fällen mehr schaden, als nutzen, und dass es oftmals einfacher ist, wenn eine Software ihre Libraries einfach selbst mitbringt (unabhängig vom Betriebssystem) - ausgenommen natürlich Libraries, die fast jedes Programm benötigt, und die tatsächlich dutzendfach im System vorhanden wären. Das würde vieles vereinfachen (keine Versionskonflikte mehr), und der zusätzliche Speicherplatzbedarf dürfte 99% aller User nicht wirklich interessieren. > > Aber gut, diese Diskussion ist wahrscheinlich für diese Mailingliste schon leicht "off topic", daher sollten wir das wohl nicht vertiefen. Es spricht ja auch nichts dagegen, den bisherigen Mechanismus mit den Factories beizubehalten, ich war nur irrtümlich davon ausgegangen, dieser wäre eigentlich unnötig und würde nicht real genutzt werden. Wenn dem so gewesen wäre, hätte man ihn in der nächsten Version einfach weglassen können. Sie ist off-topic, hier aber trotzdem auch mein Senf dazu: ich bin eher ein Verfechter der shared-libs-Variante (nicht wg. des Speicherplatzes). Wenn z.B. in der libpng ein potentiell gefährlicher buffer overflow behoben wird, will ich alle meine Anwendung, die diese Bibliothek verwenden, nicht neu installieren / compilieren müssen. In einem shared-lib-System aktualisiere ich nur meine EINE Version der Bibliothek, und alle darauf basierenden Anwendungen sind wieder "sicher" ;-) Das Problem mit Anwendungen, die eigene Versionen bestimmter Bibliotheken mitbringen, besteht zum Teil darin, dass wichtige Bugfixes oder Erweiterungen an der Original-Bibliothek erst sehr viel später - wenn überhaupt - auch bei der Anwendung ankommen (nämlich erst dann, wenn sich der Verantwortliche entschließt, mit der Anwendung auch die neuere Version der Lib. auszuliefern). Außerdem ist z.B. gerade HBCI4Java eine Bibliothek, in der aufgrund der großen Artenvielfalt und Mutations-Freudigkeit der verschiedenen HBCI-Server doch relativ häufig Anpassungen gemacht werden (müssen), damit auch der Server der Bank XY damit zufrieden ist (bzw. HBCI4Java die Nachrichten dieses Servers versteht). Wenn denn auch jedesmal ein Update der darauf basierenden Anwendungen notwendig wäre, kann man tolle Install-Parties übers Wochenende daraus machen ;-) Obwohl ich mir jetzt selbst widerspreche, finde ich die Lösung in Hibiscus aber gut - also dass dort eine bestimmte Version der Bibliothek mitgeliefert wird. Das liegt aber wohl auch daran, weil man von Hibiscus bei Bedarf auch eine bleeding-edge-Version der Software bekommen kann (die nightly builds), in denen i.d.R. auch eine sehr aktuelle (teilweise SVN-Versionen) HBCI4Java dabei ist. > Ein derartiges _gemeinsames_ Callback-Objekt hat Stefan aber für die nächste Version der Library geplant, ich denke jedoch, dass das keine so gute Idee wäre. Es hätte für manche Szenarien Nachteile, im Gegenzug scheint es mir jedoch keine Vorteile zu geben. So wollte ich meine diesbezügliche Aussage nicht verstanden wissen. :-) Mir ging es nur um den Punkt, dass bei einem Callback-Aufruf auch die aktuelle "HBCI-Session" als ein Parameter mit übergeben wird, damit eine Anwendung, die tatsächlich nur ein gemeinsames Callback-Objekt für alle HBCI-Sessions führen will, bei einem Callback auch noch unterscheiden kann, in welche Session der aufgetreten ist. Im Moment ist es so, dass man pro ThreadGroup ein eigenes Callback- Objekt verwenden kann (aber nicht muss). Das wird in dieser Form auch weiterhin so sein - nur dass HBCI4Java-3 sich nicht mehr um Threads schert, sondern das Konzept von "HBCI-Sessions" einführt, die anwendungsseitig natürlich mit Threads korrespondieren können, aber nicht müssen. > Mein Vorschlag wäre weiterhin, den Session-Identifier von außen (also durch die Anwendung) festzulegen, und nicht mehr auf die ThreadGroup zu schauen. Im Moment findet eine Trennung von Sessions ja immer anhand der ThreadGroup statt, hier wäre es einfach besser, die Trennung anhand eines Merkmals zu haben, dass die Anwendung vorgibt. Das kann ja evtl. auch die ThreadGroup sein, aber oftmals wird das irgendeine SessionId sein. Wie schon in einer der letzten Mails beschrieben: die Anwendung legt Instanzen von "HBCISession" an. Ein solches HBCISession-Objekt ist dann praktisch der "Session-Identifier". Alle möglichen anderen Objekte wie HBCIPassport, HBCIHandler (falls es sowas noch geben wird), usw. gehören dann zu einer bestimmten HBCISession. Es wird sicherlich auch weiterhin einige globale Konfigurations- Mechanismen geben, die aber eher als default-Wert für die HBCI-Sessions anzusehen sind und die man für eine bestimmte HBCI-Session auch ändern kann (in dem Punkt bin ich mir über das Ob und Wie aber noch nicht ganz klar). > Kurz zusammengefasst meine Vorschläge, nachdem ich jetzt meine falschen Vorstellungen losgeworden bin: > -> Bisheriger Mechanismus mit Factories, die von der Anwendung überschrieben werden können, sollte beibehalten werden, weil dieser (entgegen meinen Vermutungen) rege genutzt wird. Es wird einen NEUEN Mechanismus geben. HBCI4Java-2 setzt an dieser Stelle viel auf Reflection, was sehr viele Nachteile mit sich bringt. Reflection wird in HBCI4Java-3 gar nicht mehr benutzt (zumindest ist das das Ziel). Statt dessen wird es saubere Factory-Mechanismen geben wie in einer der vorherigen Mails skizziert. Grüße -stefan- -- ------------------------------------------------------------------- Dipl. Inf. (FH) Stefan Palme email: kl...@ho... www: http://hbci4java.kapott.org http://converter-db.de http://myamavis.kapott.org icq: 36376278 key fingerprint: 1BA7 D217 36A1 534C A5AD F18A E2D1 488A E904 F9EC ------------------------------------------------------------------- |
|
From: Rolf V. <ro...@we...> - 2009-02-26 18:18:01
|
> -----Ursprüngliche Nachricht----- > Von: "Olaf Willuhn" <hib...@wi...> > Gesendet: 25.02.09 00:11:24 > An: hbc...@li... > Betreff: Re: [Hbci4java-help] [Bug 84] Probleme, wenn Threads nicht selbst erzeugt werden (bei Tomcat etc .) > Hi, > > > > Das wuerde aber implizieren, dass jede Anwendung ihre eigene > > > Version von HBCI4Java mitbringt. Fuer OpenSuSE aber gibt es > > > HBCI4Java z.Bsp. als RPM > > > (http://packman.links2linux.de/package/hbci4java), welches als > > > Abhaengigkeit von mehr als einem Paket verwendet wird. > > > > Ahso, daran hatte ich überhaupt noch nicht gedacht. Wobei ich es nicht als > > Nachteil ansehen würde, wenn jede Anwendung ihre eigene Version mitbringt, > > Ich finde es ja auch einfacher, wenn jede Anwendung ihre > eigenen Libs mitbringt. Weil man sich dann einfach nicht um > die Abhaengigkeiten der anderen kuemmern muss. Die Paketmaintainer > der Distributionen legen aber grossen Wert darauf, Komponenten > wiederzuverwenden ;) Tja, das erscheint mir mittlerweile etwas fragwürdig. Zu Zeiten, als Festplatten noch wenige hundert MB Speicherplatz hatten, war die Idee, Komponenten wiederzuverwenden, wann immer möglich, sicherlich noch angebracht und sinnvoll. Aber heutzutage interessiert das eh fast keinen User mehr, dafür macht es allen das Leben unnötig kompliziert. Klar, eine Library wie die libc, die von wirklich vielen Programmen verwendet wird, möchte man nicht 50 mal im System liegen haben, aber bei weniger gebräuchlichen Libraries ist das echt egal. > Gruss > Olaf Viele Grüße, Rolf |
|
From: Olaf W. <hbc...@wi...> - 2009-02-24 13:34:33
|
Hi, > Es gibt zwar schon viel und auch gut verständliche Doku, aber die > beschreibt eigentlich nie, warum die Architektur der Library so ist, wie > sie ist, und wie es dazu gekommen ist. Wie das immer so ist mit Doku: Irgendwo wuerde man sich immer noch mehr wuenschen ;) > Achso. Das heißt dann also, dass man eine Kapselung hat, die man so > beschreiben könnte: > > User <-> Anwendungsprogramm <-> HBCI4Java-Aufsatz <-> HBCI4Java <-> > Banksysteme > > Warum auch nicht, ich würde nur behaupten, dass es immer eine Trennung > zwischen dem Anwendungsprogramm und dem HBCI4Java-Aufsatz geben sollte. > Dann wären die Verantwortlichkeiten weiterhin klar definiert. Ich sehe von "HBCI4Java-Aufsatz" jetzt nicht so ganz den Sinn. Es sei denn, man betrachtet "HBCI4Java" als _ein_ moegliches Payment-Backend, falls man neben HBCI noch andere Protokolle unterstuetzen moechte. > Nun, man müsste dann halt die HBCI4Java-Bibliothek selbst kompilieren, > damit diese zur Compilezeit alle zusätzlichen Klassen kennen. Das wuerde aber implizieren, dass jede Anwendung ihre eigene Version von HBCI4Java mitbringt. Fuer OpenSuSE aber gibt es HBCI4Java z.Bsp. als RPM (http://packman.links2linux.de/package/hbci4java), welches als Abhaengigkeit von mehr als einem Paket verwendet wird. > Hmm, man kann das noch weiterspinnen, indem der User sogar zunächst danach > gefragt wird, welchen TAN-Typ er verwenden möchte (es kann ja mehrere > geben), danach würde dann z. B. bei iTANs der TAN-Index abgerufen werden, > etc. Oder der User kann sogar interaktiv arbeiten, mit weiteren > Zwischenschritten. Halt je nachdem, was im spezifischen Fall genau > gewünscht ist. Das ist doch mittels HBCICallback bereits so. Oder meinst du etwas anderes? Gruss Olaf |