Sobre EJBs

Eu tenho uma arquitetura MVC assim:

- servidor A, possui client web, EJB1, EJB2
- servidor B, possui EJB1
- servidor C, possui EJB1

O cliente web acessa EJB2 passando parâmetros para um método, este método em EJB2 chama EJB1 em cada um dos servidores passando os mesmos parâmetros. O retorno de cada execução é então recebido por EJB2 e este através de um cálculo decide qual a resposta correta para devolver ao cliente.
Meu dúvida é a seguinte:
- quando um único cliente solicita os dados tudo funciona normalmente, mas quando eu tiver vários clientes acessando os EJBs a variável que guarda o retorno em EJB2 não irá ficar louca (receberá as resopostas de todas as solicitações)
- é criada apenas uma instância do EJB para todos os clientes?
- como que o retorno do método chamado pelo cliente retorna a este (como isto é feito)?

Um abraço.

Você está usando Entity Beans ou Session Beans ? :lol:

A quantidade de instancias do EJB2 irá variar e você não tem controle sobre isso. Você pode, conforme o seu container EJB, limitar o tamanho do pool de EJB’s. Leia algo sobre ejbActivate e ejbPassivate para entender melhor.

Se EJB2 for Statefull Session Bean, e bem implementado, a sua variável não irá ficar louca recebendo valores diversos. Se EJB2 for Stateless Session bean, se existe uma variável em EJB2 que guarda um resultado por cliente, melhor você pensar em criar um Statefull Session Bean.

O retorno do método chamado pelo cliente é síncrono. O processo chamador aguarda receber a resposta do EJB chamado. Quando recebe a resposta, ele segue o processamento. Era isso que você queria saber quanto a forma de retorno do método ? :frowning:

Eu estou usando Stateless SessionBeans, lí um pouquinho a respeito e ví que em um método se declararmos localmente um atributo o efeito é que para cada thread de execução do bean eu tenho uma nova instânica, certo? Isto resolveria o meu problema.
Quanto ao fato do processo chamador aguardar receber o retorno do método chamado, existe um controlador de timeout para que eu possa estabelecer qto tempo esperar?

Sua ajuda foi muito bem vinda, obrigado.

Não existe esse controlador de timeout. Se existir, está dentro do container e você não teria acesso.

O que se pode fazer é verificar se a chamada do método levantou uma exceção do tipo RemoteException ou em alguns casos EJBException.

Boa sorte 8)

[b][color=darkblue]Quando se tem um conjunto de servidores, eles podem estar em Cluster ou não.

Entretanto, cada tipo de EJB tem caracteristicas diferentes quando estão literalmente distribuidos.

Em “Cluster”:
SessionBean Stateless - O J2EE Server irá criar uma quantidade de instâncias que ele julgar necessário para atender a carga de aceso ao AppServer.

SessionBeans Stateful - cada create(), cria somente uma instância deste EJB para aquele cliente. Se o serviço for solicitado e por algum motivo aquela requisição for direcionada a outro container do Cluster, o J2EE Server replica o estado do EJB para a outra instancia e executa a requisição. No final da transação, ele atualiza os outros servidores do Cluster que contêm aquele EJB. No caso de o cliente chamar o remove(), ele será removido em todos os containers.

EntityBean - Tratado da mesma forma que o Stateful, com a diferença que esta instância, independente do container que estiver, somente acessado por uma transação por vez. Visto que um EntityBean, que foi identificado por um PK, não pode ser “criado” novamente, e será compartilhado por vários clientes.

MessageDrivenBean - Tratado da mesma forma que o Stateless.

Sem “Cluster”.
SessionBeans Stateless - Não se altera o comportamento.

SessionBeans Stateful - Seria criado duas sessões diferentes,uma em cada container.

Os EntityBeans - ficariam duplicados tbm, pois um create num Container criará a instância, e num segundo create, se o outro Container receber a requisição, será criado novamente, duplicando a entidade.

MessageDrivenBean - não se altera tbm.

Quanto ao tempo de vida dos EJBs, eles têm atributos como:
SessionBeans:
- Tempo de TimeOut - Se esse tempo for excedido, o J2EE Server vai remover essa instância (Stateful) ou desativar a remote (Stateless)
- Ocupação de Memoria - Determina a quantidade máxima a ser ocupada. Se o consumo de memoria do Container aumentar muito, aumentara a passivação e ativação dos EJBs.

EntityBeans
- PoolSize - Representa a quantidade de “linhas em memoria” para aquele tipo de Entidade. Se o tamanho do pool ficar reduzido, vai tbm acontecer um excesso de ativação e passivação.

MessageDrivenBeans -
- Numero de MDBs/fila - Representa a quantidade de MDBs que podem ser criados para processar as messanges aquela fila.

Espero ter ajudado.[/color][/b][/b]