Kontowechsel

 
Hiker
Benutzer
Avatar
Geschlecht: keine Angabe
Beiträge: 10
Dabei seit: 08 / 2009
Betreff:

Kontowechsel

 · 
Gepostet: 14.09.2009 - 12:36 Uhr  ·  #1
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
Benutzer
Avatar
Geschlecht:
Beiträge: 779
Dabei seit: 08 / 2004
Betreff:

Re: Kontowechsel

 · 
Gepostet: 25.09.2009 - 11:12 Uhr  ·  #2
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
Benutzer
Avatar
Geschlecht: keine Angabe
Beiträge: 10
Dabei seit: 08 / 2009
Betreff:

Re: Kontowechsel

 · 
Gepostet: 25.09.2009 - 18:40 Uhr  ·  #3
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
Benutzer
Avatar
Geschlecht:
Beiträge: 779
Dabei seit: 08 / 2004
Betreff:

Re: Kontowechsel

 · 
Gepostet: 29.09.2009 - 14:35 Uhr  ·  #4
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
Benutzer
Avatar
Geschlecht: keine Angabe
Beiträge: 10
Dabei seit: 08 / 2009
Betreff:

Re: Kontowechsel

 · 
Gepostet: 01.10.2009 - 09:39 Uhr  ·  #5
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
Benutzer
Avatar
Geschlecht:
Beiträge: 779
Dabei seit: 08 / 2004
Betreff:

Re: Kontowechsel

 · 
Gepostet: 01.10.2009 - 09:54 Uhr  ·  #6
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
Benutzer
Avatar
Geschlecht:
Beiträge: 779
Dabei seit: 08 / 2004
Betreff:

Re: Kontowechsel

 · 
Gepostet: 01.10.2009 - 09:55 Uhr  ·  #7
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
Benutzer
Avatar
Geschlecht: keine Angabe
Beiträge: 10
Dabei seit: 08 / 2009
Betreff:

Re: Kontowechsel

 · 
Gepostet: 01.10.2009 - 22:55 Uhr  ·  #8
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
Benutzer
Avatar
Geschlecht: keine Angabe
Herkunft: Leipzig
Homepage: willuhn.de/
Beiträge: 10838
Dabei seit: 03 / 2005
Betreff:

Re: Kontowechsel

 · 
Gepostet: 02.10.2009 - 00:10 Uhr  ·  #9
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
Benutzer
Avatar
Geschlecht:
Beiträge: 779
Dabei seit: 08 / 2004
Betreff:

Re: Kontowechsel

 · 
Gepostet: 02.10.2009 - 17:55 Uhr  ·  #10
@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
Benutzer
Avatar
Geschlecht: keine Angabe
Beiträge: 10
Dabei seit: 08 / 2009
Betreff:

Re: Kontowechsel

 · 
Gepostet: 04.10.2009 - 10:31 Uhr  ·  #11
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
Benutzer
Avatar
Geschlecht:
Beiträge: 779
Dabei seit: 08 / 2004
Betreff:

Re: Kontowechsel

 · 
Gepostet: 04.10.2009 - 10:58 Uhr  ·  #12
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
Benutzer
Avatar
Geschlecht: keine Angabe
Beiträge: 10
Dabei seit: 08 / 2009
Betreff:

Re: Kontowechsel

 · 
Gepostet: 05.10.2009 - 12:07 Uhr  ·  #13
Ich pack den Code bei Gelegenheit zusammen und schick's Dir per PM.
Gewählte Zitate für Mehrfachzitierung:   0