quarta-feira, 23 de abril de 2008

Introdução a Enterprise JavaBeans - Parte 2

Autor: Gleydson Lima - gleydson at j2eebrasil.com.br


O componente EJB precisa interagir com o Container, seja para se comunicar com outros componentes EJB, para ser notificados de eventos ou obter informações sobre o contexto de execução.

Existem três formas de um componente interagir com o Container, são elas:


1. Métodos de Callback


Os métodos de callback informam ao Bean sobre os eventos do ciclo de vida do componente. Esses métodos oferecem ao bean a chance de fazer algum processamento relacionado com esses eventos. Os eventos variam de acordo com o tipo do Bean em questão.


2. JNDI (Java Naming and Directory Interface)

O JNDI é uma extensão da plataforma Java para acessar serviços de nomes e diretório como LDAP, NetWare, NIS, sistemas de arquivos, dentre outros. O componente pode acessar o JNDI para obter conexões com o banco de dados e acessar outros componentes EJB.


3. EJBContext

A interface EJBContext permite ao bean acessar algumas informações sobre container como a identidade do cliente, o estado da transação bem como obter referência própria.

Como acessar componentes EJB

Os clientes seguem uma padronização para acessar um componente EJB. A primeira coisa a ser feita é procurar pela interface Home em um serviço de nomes JNDI. Caso o Bean seja encontrado, uma referência remota para a interface Home é retornada. Através da interface Home o cliente pode criar o componente e ter acesso a interface Remota.


Os métodos de negócio do componente podem ser acessados a partir da interface remota. Como ilustra o diagrama abaixo:



Diagrama de seqüência do uso de um componente EJB

A figura acima pode ser dividas nos seguintes passos:

  1. getInitialContext() : Obtêm o ponto de acesso ao serviço de nomes (veja o tutorial de JNDI);
  2. lookup() : Procura pela interface Home do componente;
  3. create() : Solicita a criação do componente;
  4. newInstance(), setXXXContext() : Trabalhos feitos pelo Container;
  5. ejbCreate() : Método callback para informar ao Bean que foi solicitado uma criação;
  6. performTask : O método de negócio é solicitado ao EJBObject;
  7. performTask : O EJBObject repassa a chamada de negócio para a implementação do componente;
  8. remove : Chamada de um remove no componente
  9. ejbRemove : Método callback para informar que o bean será removido.

Exemplo de código de um cliente:

01. public class ClienteEJB {
02.
03. public static void main(String args[]) {
04.
05. Properties props = new Properties();
06. props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory

");
07. props.put(Context.PROVIDER_URL, "jnp://localhost:1099");
08. Context ctx = new InitialContext(props);
09. PousadaHome home = PortableRemoteObject.narrow( ctx.lookup("ejb/PousadaBean"),

PousadaHome.class);
10. Pousada compNegocio = home.create();
11. System.out.println("Total de vagas:" + compNegocio.getVagas() );
12. home.remove();
13. }
14. }


O programa Java acima acessa um componente EJB chamado "PousadaBean". O primeiro passo é informar onde se localiza o servidor de nomes (linha


5. Um objeto Properties é construído com essas informações. Em seguida precisamos obter o contexto do servidor de nomes que foi estabelecido pelo Properties (linha 8).

Uma vez que o contexto foi obtido, o próximo passo é fazermos lookup pelo responsável pela criação do Bean - o Home, como mostrado na linha 9. A linha ctx.lookup("ejb/PousadaBean") faz a busca pelo Home do Bean no JNDI e o método PortableRemoteObject.narrow() faz as conversões necessários para trabalharmos com objetos IIOP(CORBA).


Criamos então um componente Pousada através da chamada home.create(), e logo após fazemos a chamada de seus métodos de negócio.

A linha 12 remove o componente do servidor.

Tipos de Componentes

A especificação do EJB 2.0 define três tipos de componentes:


1. Session Beans - Os Session Beans são componentes de negócio. A lógica de negócio dos componentes EJB se encontram nestes componentes. Existem dois tipos de Componentes Session Bean, o Stateless Session Bean e o Stateful Session Beans. O Stateless é um componente de negócio que não mantém conversação com o usuário, não há garantia que chamadas sucessivas de métodos remotos vão ser feitas no mesmo objeto. O Stateful é um componente que mantêm estado, com ele temos a garantia que chamadas sucessivas de métodos remotos feitas por um mesmo cliente serão processadas por um mesmo objeto.


2. Entity Beans - Entity Beans são componentes que representam entidades de negócio, como Cliente, Fornecedor, Gerente. Os dados das entidades se encontram em base de dados, e os componentes são responsáveis por realizar o mapeamento entre objetos de negócio e o banco de dados. Esses componentes facilitam o desenvolvimento uma vez que eliminam a necessidade do programador desenvolver código de persistência. O Container realiza a persistência e faz com que o desenvolvedor se concentre na lógica de negócio.


3. Message-Driven Beans - Message-Driven Beans são componentes ativados assíncronamente através de mensagens JMS. Os componentes Message-Driven Beans escutam uma determinada fila de mensagens e realizam algum processamento quando recebem algum dado da fila de mensagens.

Quais as vantagens de utilizar EJB?

Invocação remota de métodos Com a invocação remota de métodos podemos ter diversos clientes remotos nas mais diversas localidades.
Load Balancing Podemos ter diferentes servidores, e a cada chamada do cliente podemos balancear a carga entre os diversos servidores disponíveis.
Fail-over Quando um desses servidores der problema, devemos passar a chamar automaticamente outro servidor transparentemente para o cliente.
Transações O conceito de transação é muito importante para EJB. Com o conceito de transações, é possível acessar diversar base de dados e executar uma série de modificações, caso algum erro ocorra durante o processamente de alguma das tarefas solicitadas todo o processo é cancelado e o sistema volta ao estado inicial.
Clustering Para podermos ter tolerância à falhas, devemos replicar a aplicação entre os diversos servidores.
Threading O desenvolvedor de componentes EJB não precisa se preocupar com aspectos multitheading da aplicação. Como tratar diversos clientes? Como evitar deadlock entre as threads? Como sincronizar os objetos? Essas perguntas não devem ser respondidas pelo desenvolvedor uma vez que o Container é responsável pele tratamento dessas questões.
Suporte a MOM
(Message-oriented middleware)
Algumas requisições são baseadas em mensagens. A especificação EJB permite esse tipo de processamento através do Message-Driven Bean.
Ciclo de Vida do Objeto Quando o trafego aumente ou diminui os objetos para servi-los deverão ser criados e destruídos.
Gerenciamento de recursos Se o cliente não está mais conectado ao servidor, o servidor deve reutilizar ao máximo os recursos, retornando-os ao pool, marcando suas conexões como livre.
Segurança Podemos definir a segurança de um componente EJB simplesmente por configuração (segurança declarativa).
Caching O servidor de aplicações faz caching de componentes de Entidade de forma a otimizar o acesso ao banco de dados.


Muitos são os serviços gerenciados pelo Container EJB e que estão disponíveis ao desenvolvedor para o desenvolvimento de aplicações coorporativas escaláveis, seguras e transacionais.

Nenhum comentário: