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.
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
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
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