[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: Problemas com Xid



On Wed, 12 Nov 2003, Daniel de Angelis Cordeiro wrote:

> Estamos fazendo o seguinte:
> 
> - Utilizamos a XidFactory para gerar um Xid;

Não façam isso! Quem tem que gerar o identificador da transação é o
TxManager do JBoss, quando uma nova transação for iniciada.

Vejam o código:

  - TxManager.begin() constrói uma nova instância de TransactionImpl
  - o construtor de TransactionImpl dá uma newXid na XidFactory

O TxManager.begin() não retorna o identificador da nova transação, mas
isso não é problema. Logo depois de dar TxManager.begin(), chamem
TxManager.getTransaction(). Essa chamada retorna uma 
javax.transaction.Transaction que, na verdade, é uma TransactionImpl. 
Tendo a Transaction, vocês podem obter um GlobalId chamando
TxManager.getTransactionPropagationContext(transaction).

Olhando o código eu estou sentindo falta de um método que retorne
uma cópia (clone()) do array de bytes encapsulado por um GlobalId...
Adicionem esse método à classe GlobalId se necessário. Vocês devem
precisar do array de bytes para criar um Xid ou otid_t.

Reparem que um Xid ou otid_t tem tres partes:

 - um formatID, que no nosso caso é XidImpl.JBOSS_FORMAT_ID, 
 - um global id, que no nosso caso é o mesmo array de bytes encapsulado pelo
   GlobalId da transação,
 - um "branch qualifier", um outro array de bytes, que no nosso caso terá
   comprimento zero. 

Na struct otid_t as duas últimas partes aparecem "grudadas", formando uma
só seqüência de octetos, e há um campo bqual_length que informa o comprimento
da segunda dessas partes (o branch qualifier).

Caso isso não esteja claro, o branch qualifier faz parte do Xid, mas não
é de fato necessário para identificar a transação. Quando uma transação
envolve vários gerenciadores de transações (não é o nosso caso), cada
gerenciador pode usar esse campo para colocar informações adicionais, 
geralmente por razões de eficiência. Do ponto de vista da "identidade 
global" da transação, essas informações adicionais são irrelevantes. 
Elas só fazem sentido para um certo gerenciador de transações e têm a 
ver só com a parte da transação ("branch") que é controlada por esse 
gerenciador.

> - Para criar um PropagationContext criamos um otid_t com as informações
> do Xid criado.
>
> Porém, para utilizar o PropagationContextImporter é necessário um
> GlobalId, para criar o GlobalId é necessário um Xid. Mas, neste  
> momento, temos apenas um otid_t.
> 
> Nossas dúvidas são:
>
> - Como obter um Xid de um otid_t?
> - Em que momento deve ser criada uma Transaction?

Acho que já respondi... Um otid_t e Xid carregam as mesmas informações 
(format id, global id e branch qualifier). Uma Transaction deve ser 
criada quando alguém chamar begin() no TransactionFactory(Ext).

May the source be with you,   :-)

Reverbel