Я пытаюсь понять, как правильно вызвать метод javax.transaction.xa.XAResource.recovery(int)
. Я имею дело со средой, в которой я вручную вызываю операции XA и не имею диспетчера ресурсов контейнера.
JavaDocs просто говорит, что возможны значения флагов TMSTARTRSCAN
, TMENDRSCAN
и TMNOFLAGS
, но не предоставляйте объяснения того, что происходит, когда используются какие-либо из этих флагов или их комбинации.
Я прочесал код Glassfi sh для того, что они могут делать со значениями флага, но не сделал Там нет ничего полезного. Я посмотрел на Артемиду - она будет возвращать все незавершенные транзакции, только когда используется одинокий флаг TMSTARTRSCAN
. Postgres JDB C почти такой же, за исключением того, что TMSTARTRSCAN
может быть связан с TMENDRSCAN
, все также возвращается в одном вызове.
Я предполагаю, что причина наличия флагов есть чтобы обеспечить какую-то нумерацию результатов, если вокруг слишком много незавершенных транзакций. Таким образом, правильный способ справиться с этим:
- вызов
recover()
с TMSTARTRSCAN
- вызов
recover()
с TMNOFLAGS
до тех пор, пока полученный массив не станет пустым - вызов
recover()
с TMENDRSCAN
Для всех вышеперечисленных вызовов будьте готовы обработать возвращенные значения XID.
Но я бы с удовольствием указал или дал объяснение того, как это должно было функционировать.
ОБНОВЛЕНИЕ
Когда @kayaman изящно указал мне на спецификацию XA из X / Open, я вижу, что моё предположение, вероятно, было верным. Стандарт объясняет предполагаемое поведение намного более четко, но он не применяется один к одному для реализации Java из-за разницы в ожидаемых размерах массива. Стандарт объясняет, когда не следует звонить recover(TMENDRSCAN)
, но в случае Java неясно, и неясно, может ли неправильный вызов вызвать исключение.