Fundamentos de EJB
Componentes do framework
Ricardo Cavalcanti
[email protected]
Jobson Ronan
[email protected]
Relembrando
Enterprise bean: componente serverside que pode ser implantado num
ambiente distribuído e multicamadas
 Interface determina os serviços
oferecidos pelo bean
 Deve seguir a especificação EJB


Para garantir que o container possa
gerenciá-lo
2
Relembrando (2)
Cliente
Enterprise bean
Objeto
Remoto
Transaction
Service
Interceptador
de requisições
Security
Service
Database
Service
Stub
Skeleton
Rede
3
Componentes do EJB

Um EJB deve estar empacotado em um
JAR contendo







Uma classe que implementa o bean
Interface(s) do(s) interceptador(es) (Remota
ou Local)
Interface(s) de fábrica: Home (Remota ou
Local)
Deployment descriptor
Descritores específicos para o servidor
Classes auxiliares: geradas pelo container
Arquivo Ejb-jar
4
Classe do bean

Contém a lógica de negócio


Pode também implementar rotinas de
persistência
Implementações diferem, dependendo do
tipo



Session Beans - lógica relacionada a
processos de negócio (computar preços,
transferir fundos)
Entity Beans - lógica relacionada a dados
(mudar o nome de um cliente, reduzir o saldo)
Message-driven Beans - lógica orientada a
mensagens (eventos), lógica assíncrona
5
Interface EnterpriseBean

Todo bean implementa javax.ejb.EnterpriseBean
public interface javax.ejb.EnterpriseBean
extends java.io.Serializable{
}

Na verdade, todo bean implementa uma interface
derivada de EnterpriseBean
SessionBean extends EnterpriseBean
EntityBean extends EnterpriseBean
MessageDrivenBean extends EnterpriseBean
6
Exemplo: HelloBean
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionContext;
public class HelloBean implements javax.ejb.SessionBean {
public void ejbCreate(){..}
public void setSessionContext(SessionContext ctx) {...}
public void ejbRemove() {...}
public void ejbActivate() {...}
public void ejbPassivate() {...}
public String hello() {
System.out.println("hello");
return "Hello, World!";
}
}
7
Interface do componente

Component interface: referência para o componente






Remote component interface
Local component interface
Para criar uma interface de componente, é preciso estender
interfaces EJBObject ou EJBLocalObject
O container criará automaticamente interceptadores
contendo todos os métodos de negócio declarados
As exceções de aplicação devem ser declaradas aqui
Um bean só precisa de um tipo de interceptador (ou Local
ou Remoto) mas pode ter ambos, se necessário
8
Interface do componente

Interceptador EJBObject é objeto remoto
RMI-IIOP




É gerado pelo container e delega chamadas ao
bean
Interface javax.ejb.EJBObject estende
java.rmi.Remote
Define métodos de negócio remotos expostos
pelo bean
Todos os métodos devem indicar que lançam
RemoteException
9
Interface do componente
Cliente
Enterprise bean
Objeto
Remoto
Transaction
Service
Interceptador
de requisições
Security
Service
Database
Service
Stub
Skeleton
ComponentInterface
Rede
10
Exemplo: Interface remota
package hello.ejb;
/**
* Esta eh a interface remota do HelloBean.
*
* Esta é a interface com a qual os clientes irão operar
* quando eles interagirem com objetos EJB. O container irá
* implementar esta interface;
* o objeto implementado é o EJB object
* que irá delegar as invocações para o bean
*/
public interface Hello extends javax.ejb.EJBObject {
/**
* Método único que retorna olá para o cliente!
*/
public String hello() throws java.rmi.RemoteException;
}
11
Interface de fábrica


Estende javax.ejb.EJBHome, que define as operações para
gerenciar o ciclo de vida
Objetos EJBHome servem para




Fábrica usada para que clientes possam adquirir referências
remotas a objetos EJB



Criar objetos EJB: métodos create
Encontrar objetos EJB existentes (em Entity Beans): métodos
findXXX
Remover objetos EJB: método remove
Evita ter que registrar cada objeto: registra-se só a fábrica
Para obter uma referência a um objeto EJB, cliente chama
métodos do EJBHome
Os objetos EJBHome são parte do container e gerados
automaticamente

O programador define uma interface Home estendida de
EJBhome
12
Interface de fábrica


Métodos create devem indicar que lançam
javax.ejb.CreateException
Também pode ser local ou remota


EJBLocalHome e EJBHome
Se for remota pode lança RemoteException
13
Exemplo: Interface Home
/**
* Esta é a interface home do HelloBean. Esta interface
* é implementada pelas ferramentas do servidor - o objeto
* implementado é chamado de EJB Home Object
* e serve como uma fábrica de Beans.
*
* Cada método create() na Home Interface
* corresponde a um ejbCreate() no HelloBean
*
*/
public interface HelloHome extends javax.ejb.EJBHome{
/**
* Este método cria um EJ Object.
*
* @return Um EJB Object recém criado.
*/
Hello create() throws java.rmi.RemoteException,
javax.ejb.CreateException;
}
14
Interfaces locais x remotas

Um problema das interfaces remotas: lentidão para criar objetos
Cliente chama um stub local
2. Stub transforma os parâmetros em formato adequado à rede
3. Stub passa os dados pela rede
4. Esqueleto reconstrói os parâmetros
5. Esqueleto chama o EJBObject
6. EJBObject realiza operações de middleware como connection
pooling, transações, segurança e serviços de ciclo de vida
7. Depois que o EJBObject chama o Enterprise Bean, processo é repetido
no sentido contrário
1.

Desde EJB 2.0 é possível chamar EJBs através de sua interface
local
Cliente chama objeto local
2. Objeto EJB local realiza middleware
3. Depois que o trabalho termina devolve o controle a quem
chamou
1.
15
Interfaces locais


Interfaces locais são definidas para objetos EJBHome e para
EJBObject (interfaces EJBLocal e EJBLocalHome)
Benefícios



São opcionais


Substituem ou complementam as interfaces remotas existentes
Efeitos colaterais



Melhoria de performance mesmo com beans simples
Uso típico: fachadas Session que acessam Entities que não são
acessíveis remotamente
Só funcionam ao chamar beans do mesmo processo (não dá para
mudar o modelo de deployment sem alterar o código)
Parâmetros são passados por referência e não por valor: muda a
semântica da aplicação!!!
Uso típico: Entity Beans geralmente só têm interfaces locais
16
Exemplo: Interface local
package hello.ejb;
/**
* Esta eh a interface local do HelloBean.
*
* Esta é a interface com a qual os clientes irão operar
* quando eles interagirem com objetos EJB. O container irá
* implementar esta interface;
* o objeto implementado é o EJB object
* que irá delegar as invocações para o bean
*/
public interface HelloLocal extends javax.ejb.EJBLocalObject {
/**
* Método único que retorna olá para o cliente!
*/
public String hello();
//não há necessidade de lançar RemoteException
}
17
Exemplo: Interface Local
Home
/**
* Esta é a interface local home do HelloBean. Esta interface
* é implementada pelas ferramentas do servidor - o objeto
* implementado é chamado de EJB Home Object
* e serve como uma fábrica de Beans.
*
* Cada método create() na Home Interface
* corresponde a um ejbCreate() no HelloBean
*
*/
public interface HelloLocalHome extends javax.ejb.EJBLocalHome{
/**
* Este método cria um EJ Object.
*
* @return Um EJB Object recém criado.
*/
Hello create() throws javax.ejb.CreateException;
//não há necessidade de lançar RemoteException
}
18
Exemplo clássico
Cliente
HTML
Servlet
Cliente
WebService
Cliente
CORBA
JSP
Cliente
Swing
Taglib
remote
Session Bean
local
Session Bean
local
Entity bean
Entity bean
BD
remote
local
Entity bean
19
Exceções e EJB

Dois tipos de exceções
System-level exceptions: representam
erros críticos, falhas no banco etc.
 Application-level exceptions: exceção de
rotina, indicam violação de regras de
negócio


Por que dividir?

Transparent fail-over
20
Rule of thumb
Application-level exceptions:
lançadas para o cliente.
 System-level exceptions:

O container deve decidir o que fazer
 O bean pode lançar RuntimeException
ou RemoteException

21
Interface EJBContext

Através do contexto, o bean pode ter acesso...




Ao objeto que implementa sua interface Home
Ao usuário e perfil do usuário logado
Ao status de transações
Subtipos para cada tipo de bean
EjbContext
handlers
EJBHome
transações
Principal
inRole?
Bean
EJBLocal
Home
22
Exceções de sistema

Erros graves devem ser
encapsulados em EJBException
public void procurar(){
try{
//codigo
} catch (SQLException e){
throw new EJBException(e);
}
}
23
Deployment Descriptor


Arquivo de configurações em XML
Informa ao container sobre as
necessidades de middleware

Informações sobre a estrutura e gerência e
ciclo de vida
• Home, o Remote
• Tipo do bean





Modelo de persistência para Entity Beans
Configuração de transações
Segurança
...
Nome padrão: ejb-jar.xml
24
Exemplo: ejb-jar.xml
<?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/ejbjar_2_0.dtd">
<ejb-jar >
<enterprise-beans>
<session >
<ejb-name>Hello</ejb-name>
<home>exemplo.hello.HelloHome</home>
<remote>exemplo.hello.Hello</remote>
<local-home>exemplo.hello.HelloLocalHome</local-home>
<local>exemplo.hello.HelloLocal</local>
<ejb-class>exemplo.hello.HelloBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
25
Arquivos específicos do
fabricante

Cada servidor tem recursos adicionais que necessitam
configuração específica








Load-balancing
Clustering
Pooling
Monitoramento
Mapeamento JNDI
Geralmente são gerados por ferramentas no próprio
servidor
Podem também ser codificados à mão (jboss.xml)
Devem ser incluídos no bean antes do deployment
26
Exemplo: jboss.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd">
<jboss>
<enterprise-beans>
</session>
<session>
<ejb-name>Hello</ejb-name>
<jndi-name>ejb/Hello</jndi-name>
<local-jndi-name>HelloLocal</local-jndi-name>
</session>
</enterprise-beans>
<resource-managers>
</resource-managers>
</jboss>
27
EJB-JAR


Arquivo JAR que contém tudo o que descrevemos
Uma vez feito o EJB-JAR, o bean já pode ser implantado no
application server




Ferramentas dos containers podem descomprimir, ler e extrair
informações contidas no EJB-JAR
Depois, ferramentas realizam tarefas específicas do fabricante
para gerar EJB Objects, EJB Home, importar seu bean no
container, etc.
Pode-se ter vários beans em um ejb-jar
O EJB-JAR é um JAR comum. Exigência apenas quanto à
localização dos deployment descriptors (padrão e do
fabricante).


Coloque as classes em seus pacotes a partir da raiz
Coloque os deployment descriptors no META-INF
28
Construindo o 1º. EJB
1.
2.
3.
4.
5.
6.
7.
8.
Escreva os arquivos java: interface do interceptador,
interface home, a classe do bean e qualquer classe
auxiliar.
Escreva o Deployment Descriptor (ou use XDoclet)
Compile as classes do passo 1
Crie um EJB-jar contendo o DD e os .class
Faça o deploy no seu container
Configure seu Servidor para hospedar seu arquivo ejb-jar
(Conexões como BD, thread pools etc.)
Inicie seu container EJB e confirme que ele carregou seu
EJB-jar.
Se quiser, escreva uma classe cliente ou utilize
ferramentas para exercitar a API do seu bean.
29
Download

Fundamentos de EJB