Enganando o ejbPassivate()

9 respostas
C

Pelo que eu entendi até agora sobre ejbs, quando um Session Bean Stateful existe além do tempo limite imposto pelo container, ele é passivado. Mas antes da propriamente dita passivação, é invocado o método ejbPassivate(). Minha dúvida é a seguinte:
Digamos que o meu Session Bean tenha um atributo não serializável e mesmo assim eu quero que o meu bean seja stateful. Teria como eu dizer pro container: “Olha aqui container, eu sei que aquele atributo wyxz não é serializável ,mas eu tenho esta rotina aqui que tras uma forma serializável dele. Então eu peço que você(container) guarde esta forma, e não a forma que esta declarada no Bean”

(altos texto esse meu neh!?!?!?!?!) :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley:

Existe alguma maneira de eu fazer isso???

9 Respostas

R

olha, o que vc pode estar fazendo é declarando o atributo como transiente, só que ae ele não vai ser serializado…

agora o que vc está querendo(até onde eu sei) naum tem jeito naum…

S

não sei se entendia a sua pergunta, mas ai vai…

no ejbPassivate() você seta o atributo para null e no ejbActivate() reinstancie ele.

D

Qual é o seu atributo q nao eh serializavel!? Se for uma classe definida por vc, basta implementar a interface serializable, é tão simples… hehehe

caso seja um tipo q nao foi definido por vc e vc nao tem acesso ao fonte, é só extender este tipo e implementar a interface :okok:

Agora, se for um tipo primitivo, basta usar o wrapper dele…

Acho q vale mais a pena usar uma dessas soluções do q ficar tentando “enganar” o container

S

O problema é quando o seu tipo é uma Connection. Ai não tem jeito, você precisa setar o atributo como null e no ejbActivate() obter novamente a conexão.

D

Usar connection dentro de um Stateful!? Bom, eu nunca usei stateful, mas pra q q eu iria precisar de uma connection dentro dele!?

S

eu sei… concordo com você. Só estava citando um exemplo.

D

Ah… heheh blza… :okok:

C

Após tanto tempo de ter postado este tópico, eu digo o que no fim das contas eu fiz.
Crie mais uma camada no meu Bean. Agora não é mais o objeto que tem os caras não serializaveis que implementa SessionBean, tem um outro cara que implementa SessionBean e delega todas as chamadas para uma instancia do objeto com os caras "inserializaveis".
Assim, quando é invocado o ejbPassivate, eu pego todos os atributos do objeto por reflexão, e "serializo" cada um como eu quero.

É +/- assim:
public class BeanInserializavel{
        public ObjetoInserializavel xpto.....
        public void xpto(){
               ...................
        }
}

public class VerdadeiroBean implements SessionBean{
         public  HashMap mapa;
         public transient BeanInserializavel instancia;
         public void xpto(){
                  instancia.xpto();
         }
         public void ejbPassivate(){
                  //Pego cada atributo de instancia
                  //e coloco ele no HashMap
         }
         public void ejbActivate(){
                  //Pego cada objeto do HashMap
                  //ele coloco eles no seu devido lugar
         }
}
S

Tome cuidado pois pela especificação do EJB, o container não é obrigado a guardar os valores de variáveis transient após o ejbPassivate(), isto vai afetar a portabilidade do seu código.

Criado 5 de fevereiro de 2005
Ultima resposta 17 de abr. de 2005
Respostas 9
Participantes 4