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

Re: Recuperação o de quedasde resources





> > >   Além disso, só  para confirmar, achamos que o  código de recuperação
> > > de queda  do servidor  (do JBoss), deve  ser feita durante  a primeira
> > > instanciação  do TxManager  que é  chamada na  inicialização  do Mbean
> > > TransactionManagerService (no startService()). Tá certo? 
> > > 
> > 
> >     Concordo! Mas este tipo de coisa, como também a criação do arquivo de
> > log, eu estava pensando em fazer no construtor do TxManager. Não dá?
> 
>   Sim,  sim! Foi  o que  fizemos. Acho  que me  expressei mal,  mas no
> parágrafo acima quando escrevi "a primeira instanciação do TxManager",
> é exatamente no construtor do TxManager (ele uso o mecanismo de deixar
> o construtor privado e  permitir acesso pelo getInstance() que devolve
> um singleton - método para garantir a unicidade do objeto no JBoss). 
> 

  Ops.. Acho que tenho um problema. Tentei começar a implementar a
recuperação de falhas no construtor do TxManager. Seguindo a minha
estratégia, tentei pegar no JNDI todas as referências para bancos de dados
configuradas no JBoss.
  Infelizmente, no momento da primeira instanciação do TxManager, os
bancos de dados ainda não foram configurados, e não existe referência para
eles no JNDI ainda. Isto dá prá perceber só com o Hypersonic: tente
listar as referências do JNDI em "java:/" no construtor do TxManager, e
nem a referência para o DefaultDS aparece. Mas se vc fizer isso novamente 
um pouco depois, a referência ao DefaultDS aparece normalmente, e os
log's de inicialização do JBoss mostram o TxManager sendo inicializado
*antes* de ser disponibilizada uma referência JNDI para o DefaultDS. É o
problema do ovo e da galinha: prá subir um banco no JBoss é preciso que o
TxManager já esteja instanciado, mas para instanciar o TxManager é preciso
fazer o recovery, que precisa dos bancos de dados já configurados.
  Eu não sei aonde poderia ser feito o ponto de entrada para o processo de
recovery. O ideal seria colocar o recovery depois de ter sido feita a
inicialização do JBoss, mas antes de começar o deployment. Entretanto não
tenho a menor idéia de onde fica este ponto do código nas classes do
JBoss. Não sei se utilizando algum ConnectionFactory existiria uma forma
de contornar este problema.
  A minha solução, apesar de errada, é colocar o recovery dentro do begin
do TxManager. Ainda assim, o begin é chamado algumas vezes sem que todas
as referências aos bancos tenham sido criadas. Então meu processo de
recovery funcionaria assim: cada vez que uma nova transação vai começar,
eu vejo os bancos de dados configurados, faço recovery deles, e marco como
já recuperados. Da próxima vez que for iniciada uma transação, eu vejo se
existe alguma referência a algum banco não recuperado, e repito o
processo. Isso é errado, porque depende de que seja feita pelo menos uma
nova transação para que um dado banco seja recuperado, o que não faz muito
sentido.. Se alguém tiver alguma idéia de onde colocar o ponto de entrada
do recovery, ela será bem vinda.

  Abraços,

  Beto
  <speicys@etc...>