quarta-feira, 23 de abril de 2008

Introdução a Enterprise JavaBeans - Parte 1

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


Os componentes EJB facilitam o desenvolvimento uma vez que eles tratam automaticamente a segurança, persistência, transação dentre outros serviços. Dessa forma o desenvolvedor não precisa se preocupar com a implementação programática desses serviços, a não ser que realmente deseje. Por ter essas facilidades, rapidamente o EJB tornou-se um padrão para desenvolvimento de aplicações coorporativas distribuídas e multicamadas.


Os componentes EJB não são acessados diretamente pelo cliente, como ocorre em RMI (Remote Method Invocation). A aplicação cliente requisita o acesso ao Container que por sua vez faz a chamada ao objeto EJB. O gerenciamento do ciclo de vida do Bean, o controle transacional, pooling, dentre outros aspectos são gerenciados pelo Container EJB. Todo componente EJB é executado dentro de um Container EJB.


A tecnologia Enterprise Java Beans é, portanto, um modelo de componentes do lado servidor. Por ser um modelo de componentes, ele deve seguir algumas regras durante o seu desenvolvimento. Existem interfaces responsáveis por tarefas definidas, regras de herança, dentre outros aspectos que devemos seguir durante a implementação de componentes EJB.

Modelo de componentes

O modelo de componentes define como criar componentes Enterprise JavaBeans, para isso precisamos conhecer alguns dos elementos mais importantes:


Interface Remota Na interface remota encontram-se os métodos que o componente vai publicar para chamada por clientes remotos.
Interface Home A interface Home define métodos para tratar do ciclo de vida do Bean, como criação, remoção e busca de componentes. É através da interface Home que o cliente obtêm a interface Remota do Bean.
Bean O Bean é onde se encontra a implementação da lógica de negocio do componente distribuído.


Imagine que temos um componente que trata algumas das atividades de uma Pousada, como por exemplo reservar quartos, solicitar total de vagas etc. Para desenvolvermos esse componente, precisamos de uma interface do tipo Home (responsável pelo ciclo de vida) e uma outra do tipo Remote (responsável pela efetivação dos métodos de negócio). Essas interfaces necessitam seguir o seguinte diagrama de classes:



A interface Pousada (interface Remota) deve herdar da interface javax.ejb.EJBObject que por sua vez herda de java.rmi.Remote. Todas as interfaces que definem chamadas remotas devem herdar da interface java.rmi.Remote.


A interface Home herda de javax.ejb.EJBHome.


import javax.ejb.EJBObject;
import java.rmi.RemoteException;

public interface Pousada extends EJBObject {
public int getVagas() throws RemoteException;

public int getTotalHospedes() throws RemoteException;


public void reservar(Reserva hospede) throws RemoteException;
}


A interface Remota Pousada define os métodos de negócio do componente. Nesse exemplo, este componente possui três métodos de negócio que podem ser chamados remotamente.


A interface Home define agora como podemos criar o componente Pousada, como é mostrado abaixo:


import javax.ejb.EJBHome;
import java.rmi.RemoteException;

public interface Pousada extends EJBHome {
public void create() throws RemoteException;


}


O componente pode ser criado através do método create() sem argumentos. Porém, poderíamos ter componentes (aqueles que mantêm estado) que desejássemos iniciar algumas variáveis, e a definição da assinatura do método create() seria importante.


O Bean possui a implementação da lógica de negócio. Como mostramos abaixo:


import javax.ejb.*;
import java.rmi.RemoteException;

public class PousadaBean implements SessionBean {

private javax.ejb.SessionContext context;

public void setSessionContext(javax.ejb.SessionContext
aContext) {

context=aContext;

}

public void ejbActivate() {
/* Esse método é chamado pelo EJB Container para
notificar que esse Bean foi ativado */
}


public void ejbPassivate() {

/* Esse método é chamado pelo EJB Container para notificar
que esse Bean foi passivado */
}

public void ejbRemove() {

/* Esse método é chamado pelo EJB Container para notificar

que esse Bean vai ser removido */
}

/* implementação do create definido na interface Home.

public void ejbCreate() {
System.out.println("Bean Criado");
}


/* Implementação dos métodos de negócio */

public int getVagas() {
// Implementação do método getVagas()
}
public int getTotalHospedes() {
// Implementação do getTotalHospedes

}


public void reservar(Reserva hospede) {
// Implementação do método reservar
}
}


Note que a codificação do Bean não implementa a interface Remota. Isto ocorre porque o cliente não chama diretamente a implementação do Bean, existe um outro objeto que o cliente se comunica diretamente e que repassa para o Bean como mostra a figura abaixo:



Alguns métodos foram declarados com o prefixo ejb. Esses métodos são os denominados callback methods. Eles são chamados para notificar a instância do Bean sobre algum evento que aconteceu, como criação, ativação, remoção, dentre outros eventos que serão visto com mais detalhes em outros artigos/tutoriais.

Deployment Descriptors

Os Deployment Descriptors são arquivos XML que permitem configurar os componentes EJB antes de serem implantados, possibilitando realizar ajustes sem a necessidade de alterar o código fonte. Essa flexibilidade na utilização dos componentes é importante uma vez que o mesmo componente EJB pode ter diferentes configurações a depender de sua utilização. Os deployment descriptors configuram os serviços usados pelos componentes EJB, tais como: segurança, controle transacional, persistência de dados, dentre outros.


Abaixo temos um exemplo de um deployment descriptor:


<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN'
'
http://java.sun.com/dtd/ejb-jar_2_0.dtd'
>

<ejb-jar>
<display-name>PousadaBean</display-name>
<enterprise-beans>
<session>
<display-name>PousadaBean</display-name>

<ejb-name>PousadaBean</ejb-name>
<home>PoousadaHome</home>
<remote>Pousada</remote>
<ejb-class>PousadaBean</ejb-class>
<session-type>Stateless</session-type>

<transaction-type>Bean</transaction-type>
</session>
</enterprise-beans>

</ejb-jar>


Esse documento XML descreve a configuração do Componente PousadaBean. No deployment descriptor se diz qual o tipo do Bean, sua interface Home e Remota, seu modelo de transação, dentre diversas outras informações que não foram mostradas por motivo didático.

Processo de Deployment

O processo de deployment é a implantação do componente no servidor de aplicações. É no processo de deployment que o Container EJB irá ler os deployment descriptors da aplicação e implantá-la com as características desejadas.


O processo de deployment varia de servidor para servidor, não havendo uma regra universal para sua realização. Depois desse processo, o componente está pronto para receber solicitações.


Nenhum comentário: