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

Re: Propagacao de contexto



On Tue, Nov 30, 2004 at 10:54:45PM -0200, Ivan Bittencourt de Araujo e Silva Neto wrote:
> Ola a todos.
> Estou com dificuldades para entender a propagacao do contexto transacional nas
> chamadas IIOP. Pelo que entendi, o contexto e propagado de maneira implicita e
> automatica. O que vi no codigo-fonte do JBoss foi o seguinte: O EJB rodando
> sobre RMI/IIOP vai usar a interface org.jboss.tm.iiop.client.IIOPClientUserTransaction,
> que implementa javax.transaction.UserTransaction. A partir dai, na hora de
> criar uma transacao, ele pega aquele servente default que o Reverbel comentou
> hoje na aula (org.jboss.tm.iiop.TransactionServiceImpl), chama create_transaction
> e depois configura um client interceptor para colocar o contexto da transacao
> nas chamadas IIOP. 

Certo.

> Ate ai blz. O problema que estou tendo e com o EJB alvo da requisicao IIOP feita
> por um primeiro EJB. Minha ideia era a seguinte: quando o EJB alvo fosse usar um
> recurso XA, no metodo enlistResource da classe org.jboss.tm.TransactionImpl eu
> faria um register_resource com o coordinator do servidor de aplicacoes do EJB
> que fez a requisicao IIOP. Mas como eu tenho acesso ao contexto transacional?
> Vi a classe org.jboss.tm.iiop.client.TransactionCurrent, mas acho que nao e
> por ela que eu acesso qualquer dado do contexto transacional.

Não é mesmo. Essa classe só é útil para clientes CORBA que queiram fazer
demarcação de transações. Ela implementa CosTransactions::Current.

> Dei uma olhada tambem no interceptador do lado servidor
> org.jboss.tm.iiop.TxServerClientInterceptor, que e o equivalente do interceptador
> que do lado cliente coloca o contexto transacional, mas nao encontrei nada muito
> util.

De fato esse interceptador não faz muita coisa. A especificação EJB não
requer a propagação do contexto transacional nas chamadas inter-servidores,
mas ela exige que o servidor alvo da chamada seja pelo menos informado
que a chamada está sendo feita dentro de uma transação (cujo contexto
não foi propagado). Isso é necessário para que o servidor alvo possa
lançar uma exceção, dependendo da configuração do EJB chamado. (Uma 
exceção deve ser lançada caso o descritor de implantação do EJB chamado
diga que o método deve ser executado no contexto transacional do chamador.)

Hoje o TxServerClientInterceptor está colocando um contexto transacional
vazio nas chamadas inter-servidores que deveriam carregar um contexto
transacional de verdade. O contexto vazio diz ao servidor alvo que o
método foi chamado dentro de uma transação, mas não fornece nenhuma
informação sobre essa transação. Essa é uma das coisas que vocês devem
mudar.

> Enfim, como obter acesso ao contexto transacional que e carregado junto com
> a requisicao IIOP?

Veja org.jboss.tm.iiop.TxServerInterceptor.getCurrentTransaction().
Hmmm... Estou olhando esse método agora e estou vendo algo que me 
parece uma bobagem. Acho que as linhas 

               if (pc.current.coord == null)
                  tx = ForeignTransaction.instance;

são supérfluas. Não fui eu quem as colocou lá!

> 
> Nao sei se faz sentido o que acabei de escrever, mas agradeco qualquer ajuda.

Faz sim...

Reverbel