2016-07-08 22 views
1

SomeClass erweitert XAResource Klasse hier festgelegt. In SomeClass.start(), Ich gründe ein threadlocaldata mitThread lokale Daten kommen als Null in commit(), die ich in start() von XAResource Klasse

private static ThreadLocal<Xid> tlData = new ThreadLocal<Xid>(); 
tldata.set(Xid) 

In SomeClass.commit() ich die Daten

Xid xid = tldata.get() 

Aber ich bin immer null zu bekommen versuchen. Ich verstehe nicht warum.

+0

Das würde bedeuten, dass 'XAResource.start()' und 'XAResource.commit()' von verschiedenen Threads aufgerufen werden. Haben Sie das Serverprotokoll überprüft, um zu diagnostizieren, welcher Thread welche Methode ausführt und welche (was wäre interessant) ihre Stack-Traces zum Zeitpunkt des Aufrufs erhalten würden? Ich denke, es gibt kein Wort in der Spezifikation, dass die Methoden 'start()' und 'commit()' aus demselben Thread aufgerufen werden müssen. Ich würde erwarten, dass 'commit()' und 'prepare()' aus demselben Thread aufgerufen würden, da ich denke, dass das Transaktionsobjekt selbst als 'ThreadLocal' implementiert werden könnte. – chalda

+0

Danke für die Antwort. Die XAResource.start() und XAResource.commit() werden von dem Weblogic-Server aufgerufen, auf dem ich meine Anwendung bereitgestellt habe. Ich denke, von welchen Threads diese Methoden aufgerufen werden, hängt vom Weblogic-Server ab und ich habe keine Kontrolle darüber. – Arnoj

+0

von dem, was ich die Spezifikation verstehe, die 'XAResource.start' und' XAResource.commit' könnten aus verschiedenen Threads aufgerufen werden, da die globale Transaktion vom aktuellen Thread getrennt und an einem anderen Thread verwendet werden könnte. Ich denke, dass 'prepare()' und 'commit()' dann von demselben Thread aufgerufen werden sollten. Aber es ist etwas anderes. Wenn 'SomeClass'' XAResource' erweitert, müssen Sie 'Xid' nicht beim Aufruf der' start' Methode speichern, da die Definition von 'commit'' 'commit (Xid xid, boolean onePhase)' 'ist. Die 'XID' wird Ihnen zur Verfügung gestellt, wenn WebLogic das' commit' aufruft. Fehle ich hier etwas? – chalda

Antwort

0

Es gab einen kleinen Fehler, den ich im Code entdeckt habe. Sie verwendeten das gleiche Xid-Objekt, um eine neue Wrapper-Klasse in commit() und start() zu erstellen. Offensichtlich waren die Wrapper-Objekte in commit() und start() anders.

Hinweis: XID ist vom Typ XidWrapper, der sich von Xid (Original) unterscheidet.