Kontowechsel

Hiker

Betreff:

Kontowechsel

 ·  Gepostet: 14.09.2009 - 12:36 Uhr  ·  #60704
Hallo,

habe mir ein kleines GUI geschrieben in dem ich für mehrere Konten Umsätze und Salden abfragen kann. Allerdings klappt das nicht mit einem Kontowechsel. Code-Vorbild war HBCIBatch.java, nach einem Konto-Wechsel bekomme ich
Code
9010:Der Auftrag wurde nicht ausgeführt. (3: CustomMsg.GV.KUmsZeit5)

9010:Konto nicht zugeordnet. (MOB90000000071) (3: CustomMsg.GV.KUmsZeit5)Global Error


Rufe ich das gleiche Konto mit einer frisch gestarteten GUI auf, dann klappt alles. D.h. irgendwas bleibt wohl hängen, ich habe aber definitiv keine globalen or static Sachen, HBCIPassport und HBCIHandler werden brav mit .close() geschlossen, die ganze GetTransactions Klasse jeweils neu initialisiert.

Was mich stutzig macht: Ich füher eigentlich einen KUmsAll aus, keinen KUmsZeit5 ?

Danke,
Hiker

kleiner77

Betreff:

Re: Kontowechsel

 ·  Gepostet: 25.09.2009 - 11:12 Uhr  ·  #60987
Zitat
Was mich stutzig macht: Ich füher eigentlich einen KUmsAll aus, keinen KUmsZeit5


Lass Dich davon nicht beirren - das eine (KUmsAll) ist der "Highlevel-Name" des Geschäftsvorfalls, wie er für Anwendungsentwickler relevant ist. Das andere ist ein "Lowlevel-Name", wie er in der HBCI4Java-internen Syntaxbeschreibung des HBCI-Protokolls verwendet wird - alles im grünen Bereich.

Zum eigentlichen Problem: ich nehme an, in Deinem Programm machst Du sowas:
Code
HBCIJob job=...;
job.addToQueue();


Versuche statt dessen:
Code
...
job.addToQueue(kundenKennung);

(siehe API-Doku dazu).

-stefan-

Hiker

Betreff:

Re: Kontowechsel

 ·  Gepostet: 25.09.2009 - 18:40 Uhr  ·  #61013
Hmmm, bringt leider nichts. Ich habe eben im Debugger festgestellt, dass beim zweiten Aufruf (nach dem Kontowechsel) in

Code
HBCIPassport passport = AbstractHBCIPassport.getInstance(passportDescription);


das vorherige Konto steht. d.h. für mich, dass AbstractHBCIPassport.getInstance an der Stelle was Falsches liefert, oder ?

(ich mache natürlich am ende des jobs einen passport.close();)

kleiner77

Betreff:

Re: Kontowechsel

 ·  Gepostet: 29.09.2009 - 14:35 Uhr  ·  #61121
Hmmm... möglicherweise reden wir irgendwie aneinander vorbei. Was genau verstehst Du denn unter einem "Kontowechsel"? Ein "Passport" repräsentiert jedenfalls einen bestimmten HBCI-Zugang bei einer Bank (über den u.U. auf mehrere Konten zugegriffen werden kann).

Mit AbstractHBCIPassport.getInstance() willst Du also offensichtlich einen anderen HBCI-Zugang benutzen. Die dafür notwendigen Parameter musst Du natürlich vorher mit HBCIUtils.setParam("client.passport....", "...") entsprechend setzen.

Außerdem muss nach dem Erzeugen eines neuen Passport-Objektes auch ein entsprechendes neues Handler-Objekt erzeugt werden:

Code
HBCIHandler handle=new HBCIHandler(hbci_version, passport)


Mit dem so erzeugten neuen HBCI-Handle kannst Du dann neue Jobs erzeugen (handle.newJob()), und ausführen (handle.execute()).

Evtl. hilft es ja, wenn Du mal den relevanten Ausschnitt Deines Codes auf pastebin o.ä. zeigst und außerdem klärst, was genau Du unter "Kontowechsel" verstehst - ich vermute dort das eigentliche Problem...

Grüße
-stefan-

Hiker

Betreff:

Re: Kontowechsel

 ·  Gepostet: 01.10.2009 - 09:39 Uhr  ·  #61211
Zitat geschrieben von kleiner77
Hmmm... möglicherweise reden wir irgendwie aneinander vorbei. Was genau verstehst Du denn unter einem "Kontowechsel"? Ein "Passport" repräsentiert jedenfalls einen bestimmten HBCI-Zugang bei einer Bank (über den u.U. auf mehrere Konten zugegriffen werden kann).

Ja, so verstehe ich das auch.
Zitat
Mit AbstractHBCIPassport.getInstance() willst Du also offensichtlich einen anderen HBCI-Zugang benutzen.

Genau.
Zitat
Die dafür notwendigen Parameter musst Du natürlich vorher mit HBCIUtils.setParam("client.passport....", "...") entsprechend setzen.

Außerdem muss nach dem Erzeugen eines neuen Passport-Objektes auch ein entsprechendes neues Handler-Objekt erzeugt werden:

Code
HBCIHandler handle=new HBCIHandler(hbci_version, passport)


Mit dem so erzeugten neuen HBCI-Handle kannst Du dann neue Jobs erzeugen (handle.newJob()), und ausführen (handle.execute()).

Ja, genau das mach ich auch.

Zitat
Evtl. hilft es ja, wenn Du mal den relevanten Ausschnitt Deines Codes auf pastebin o.ä. zeigst und außerdem klärst, was genau Du unter "Kontowechsel" verstehst - ich vermute dort das eigentliche Problem...


Ok: Code-Schnipsel

Die hervorgehobenen Zeilen sind m.E. das was Du auch sagst ... Aber vielleicht hab ich noch einen anderen Knoten im Hirn ?

Danke jedenfalls für die Unterstützung !

kleiner77

Betreff:

Re: Kontowechsel

 ·  Gepostet: 01.10.2009 - 09:54 Uhr  ·  #61212
Die die Klasse "FetchTransactions" ein Runnable ist, gehe ich mal davon aus, dass Du versuchst, die beiden HBCI-Dialoge in zwei parallel laufenden Threads gleichzeitig ausführst? Falls ja - hast Du README.MultiThreading gelesen und beachtet, dass es in diesem Fall nicht reicht, zwei parallele Threads zu haben, sondern dass jeder Thread in einer EIGENEN ThreadGroup laufen muss?

Wenn das nicht die Ursache sein kann - lass Dir vor "HBCIUtils.init()" mal den Inhalt von "props" ausgeben - das sollte sehr aufschlussreich sein :)

-stefan-

kleiner77

Betreff:

Re: Kontowechsel

 ·  Gepostet: 01.10.2009 - 09:55 Uhr  ·  #61213
Ah, und noch was - HBCIUtils.init() muss nur EINMAL innerhalb einer Applikation aufgerufen werden. Für alle weiteren Threads sollte HBCIUtils.initThread() verwendet werden

-stefan-

Hiker

Betreff:

Re: Kontowechsel

 ·  Gepostet: 01.10.2009 - 22:55 Uhr  ·  #61246
Zitat geschrieben von kleiner77
Die die Klasse "FetchTransactions" ein Runnable ist, gehe ich mal davon aus, dass Du versuchst, die beiden HBCI-Dialoge in zwei parallel laufenden Threads gleichzeitig ausführst?


Nein, Runnable weil Aufruf aus einem SWT GUI.

Zitat
Wenn das nicht die Ursache sein kann - lass Dir vor "HBCIUtils.init()" mal den Inhalt von "props" ausgeben - das sollte sehr aufschlussreich sein :)


Die Inhalte von props sind korrekt, ich lade die ja in dem neuen Thread neu.
HBCIUtils.initThread() bringt auch nix, bin kurz davor aufzugeben, dann lass ich den output halt weiter in ein command fenster laufen ...

hibiscus

Betreff:

Re: Kontowechsel

 ·  Gepostet: 02.10.2009 - 00:10 Uhr  ·  #61247
Ich wuerde dir ja vorschlagen: Lass den Code ein paar Tage liegen und schau dann nochmal drauf. Das riecht irgendwie nach einer banalen Ursache, die du nur im Moment wegen der vielen Baeume nicht siehst ;)

kleiner77

Betreff:

Re: Kontowechsel

 ·  Gepostet: 02.10.2009 - 17:55 Uhr  ·  #61270
@Hiker: Wie gesagt: Benutze HBCIUtils.log(), um vor HBCIUtils.initThread() den Inhalt Deines "props"-Objektes auszugeben - und schick dann mal das komplette HBCI4Java-Log, welches Deine Anwendung erzeugt. Gern auch per PN oder Mail (hbci4java at kapott pkt org). Der Fehler *muss* trivial sein :)
-stefan-

Hiker

Betreff:

Re: Kontowechsel

 ·  Gepostet: 04.10.2009 - 10:31 Uhr  ·  #61297
So, des Rätsels Lösung: die Debug Meldung "manager.HBCIUtils: will not initialize this threadgroup because it is already initialized" beim zweiten Aufruf des Threads hat mich auf die Spur gebracht:

Ein HBCIUtils.doneThread(); am Ende des Threads. Uff.

Danke trotzdem !

Hiker

kleiner77

Betreff:

Re: Kontowechsel

 ·  Gepostet: 04.10.2009 - 10:58 Uhr  ·  #61298
Ich glaube nicht, dass das die Lösung des eigentlichen Problems ist, denn doneThread() macht nur ein paar relativ simple (und eigentlich unwichtige) Aufräumarbeiten (die eigentlich nur dazu dienen, bei länger laufenden Anwendungen den Speicherbedarf nicht ins unermessliche steigen zu lassen)...

-stefan-

Hiker

Betreff:

Re: Kontowechsel

 ·  Gepostet: 05.10.2009 - 12:07 Uhr  ·  #61311
Ich pack den Code bei Gelegenheit zusammen und schick's Dir per PM.