SomeClass
расширяет класс XAResource
. В SomeClass.start()
, я устанавливаю в threadlocaldata
с помощьюВвод локальных данных, следующих как null в commit(), который я установил в start() класса XAResource
private static ThreadLocal<Xid> tlData = new ThreadLocal<Xid>();
tldata.set(Xid)
В SomeClass.commit()
Я пытаюсь получить данные
Xid xid = tldata.get()
Но я получаю null
. Я не понимаю, почему.
Это означает, что 'XAResource.start()' и 'XAResource.commit()' вызывается разными потоками. Вы проверили журнал сервера, чтобы определить, какой поток запускает какой метод и (что было бы интересно) получить трассировку стека во время вызова? Я думаю, что в спецификации нет слова о том, что методы 'start()' и 'commit()' должны вызываться из одного потока. Я ожидал бы, что 'commit()' и 'prepare()' будут вызываться из того же потока, что и сам объект транзакции может быть реализован как 'ThreadLocal'. – chalda
Спасибо, что ответили. XAResource.start() и XAResource.commit() вызывается сервером Weblogic, на котором я развернул приложение. Я думаю, из каких потоков эти методы вызываются, зависит от сервера weblogic, и у меня нет контроля над ним. – Arnoj
из того, что я понимаю, спецификация 'XAResource.start' и' XAResource.commit' может быть вызвана из разных потоков, поскольку глобальная транзакция может быть отключена от текущего потока и использоваться на другом. Я думаю, что 'prepare()' и 'commit()' следует вызывать из одного потока. Но это другое дело. Если 'SomeClass' расширяет' XAResource', вам не нужно сохранять 'Xid' при вызове метода' start', поскольку определение 'commit' является' commit (Xid xid, boolean onePhase) '. 'XID' предоставляется вам в момент, когда WebLogic вызывает' commit'. Я что-то упустил? – chalda