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

Re: Desespero total



On Sun, Dec 12, 2004 at 10:21:33AM -0200, Ivan Bittencourt de Araujo e Silva Neto wrote:

> >    Eu estava usando o serviço de nomes do CORBA (*) no SA2 para pegar a 
> > referência do EJB no SA1. Aparentemente, tudo funcionava, mas desse 
> > jeito aí, o único interceptador que eu via ser chamado era o 
> > TxServerInterceptor. Os outros dois eu não vi serem chamados nenhuma 
> > vez...
> Acho que nesse caso o TxClientServerInterceptor deveria ser chamado quando
> o SA2 delega a chamada para o SA1. E pelo erro que voce informou abaixo ele
> realmente deveria estar chamando o metodo send_request desse interceptador.
> Pelo que me lembro, o send_request e chamado e manda junto com a requisicao
> um PropagationContext vazio.

Sim, é isso mesmo. Quando o Danilo usou o serviço de nomes CORBA ele
não foi chamado (pois o representante local desse serviço foi registrado
com um ORB sem interceptadores), mas foi chamado no caso do arranjo (**).

> > 20:10:14,337 ERROR [LogInterceptor] RuntimeException in method: public 
> > abstract matricula.GerenciadorDeMatriculas 
> > matricula.GerenciadorDeMatriculasHome.create() throws 
> > java.rmi.RemoteException,javax.ejb.CreateException:
> > java.lang.RuntimeException: Not a TransactionImpl, but a 
> > org.jboss.proxy.ejb.ForeignTransaction...
> Esse erro acontece porque o TxServerInterceptor.getCurrentTransaction() tenta
> importar o contexto transacional, mas nao consegue (porque esta vazio), entao ele
> importa essa fake transaction "ForeignTransaction".

Certo. Note que esse desaparece se você mudar o atributo transacional
no ejb-jar.xml do EJB alvo. Você provavelmente está com

   <trans-attribute>Required</trans-attribute>

que diz o seguinte: "Se a chamada ocorrer dentro de uma transação, importe
o contexto transacional. Se ocorrer fora de transação, crie uma transação
nova para a chamada." Experimente trocar para

   <trans-attribute>RequiresNew</trans-attribute>

Agora a exceção não deve ocorrer, pois agora o JBoss não vai nem tentar 
importar o contexto transacional dummy. O RequiresNew manda o servidor 
criar uma transação nova, mesmo que a chamada venha com um contexto 
transacional (que é ignorado).

Faz parte do EP acertar as coisas para que o contexto transacional seja
importado corretamente, de modo que o erro não ocorra no caso Required.

> Se eu nao me engano, o
> getCurrentTransaction() chama algo que no fim acaba caindo no
> TxManager.importTransactionContext() (algo desse tipo), e acho que é esse cara
> que retorna ForeignTransaction.instance. O que eu fiz foi nesse metodo importar
> o contexto CORBA e devolver uma transacao valida.

Sim, é isso mesmo que deve ser feito!

> >    A minha principal dúvida é: o ambiente de testes que eu fiz é válido ?
> Eu acho que sim, mas e melhor voce ver tambem a opiniao dos experts da lista.

Sim, é. Tenho uma objeção conceitual quando ao uso do JNP para pegar o home 
de um EJB remoto: como o JNP é específico do JBoss, você está exigindo
que o EJB remoto more num JBoss. Entendo que ninguém está usando o serviço 
de nomes CORBA por causa do problema do ORB sem interceptadores, que agora
vocês sabem como resolver... Mas a solução mais limpa é usar uma ejb-ref 
definida no descritor de implantação. Daqui a pouco eu mando para a lista 
um exemplo de acesso a EJB remoto via ejb-ref.

Reverbel