session beans ricardo cavalcanti [email protected] jobson ronan [email protected]

33
Session Beans Ricardo Cavalcanti [email protected] Jobson Ronan [email protected]

Upload: aurora-cortes-lombardi

Post on 07-Apr-2016

229 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Session Beans

Ricardo [email protected]

Jobson [email protected]

Page 2: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

O que são? São objetos de processo de negócio

Implementam lógica e regras de negócios, algoritmos e workflow

São componentes reusáveis que representam acções

Sua principal diferença dos Entity Beans é o seu escopo de vida Um Session Bean dura no máximo uma sessão

(do cliente)

Page 3: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

O que são? Sessão?

Tempo que o browser está aberto Tempo que um outro bean usa o session bean Tempo que uma aplicação remota esta aberta

Session Beans são Objetos transientes Não tem seu estado armazenado em meio

persistente

Page 4: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Tipos de Session Beans Clientes efetuam um diálogo com o bean

(dialogo é a interação do cliente com o bean) Consiste de uma ou mais chamadas entre

cliente e bean Dura um processo de negocio para o cliente

Os dois tipos de Session Beans implementam diferentes tipos de diálogos Stateful Session Beans Stateless Session Beans

Page 5: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Tipos de Session Beans Stateful Session Beans implementam

diálogos que consistem de várias requisições onde certas requisições podem depender de requisições anteriores

Stateless Session Beans implementam dialogos que consistem de apenas um requisição

Page 6: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Stateless Session Beans Como stateless session beans não

mantém informação de estado do diálogo, todas as instâncias do mesmo bean são equivalentes e indistiguíveis Não importa que chamou o bean no passado,

qualquer instância disponível de um session bean pode servir a qualquer cliente

Por este motivo, Stateless Session beans podem ser guardados em um pool, reutilizados, e passados de um cliente para outro em cada chamada de método

Page 7: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Stateless Session Beans

Pool de Stateles Session Beans

Cliente

Interface remota

EJBObject

invoke()Pool de Stateles Beans

BeanBean

Bean

Bean

Bean

invoke()

Page 8: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Stateless Session Beans Pela interface javax.ejb.SessionBean, cada

Session bean precisa implementar os seguintes métodos void setSessionContext (SessionContext ctx)

• Associa o bean com o contexto da sessão• O contexto pode ser usado para obter referências

para o interceptador e home do bean, se necessário• Guarde a referência em uma variável de instância

//...

private SessionContext ctx;

void setSessionContext(SessionContext ctx) {

this.ctx = ctx

}

//...

Page 9: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Stateless Session Beans void ejbCreate()

• Realiza a inicialização do bean. Pode ser vazio. void ejbRemove()

• Chamado antes de liberar recursos e ser removido da memória. Pode ser vazio.

void ejbPassivate()• Não implementado por Stateless Session Beans. Deixe

vazio. void ejbActivate()

• Não implementado por Stateless Session Beans. Deixe vazio.

Page 10: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Stateless Session Beans javax.ejb.SessionContext

Usado para obter o contexto de execução do Session Bean

Extende javax.ejb.EJBContext com dois metodos

• getEJBLocalObject(): retorna a referência para o interceptador local (gerado pelo container)

• getEJBObject(): retorna a referência para o interceptador remoto (que é objeto Remote)

Estes métodos podem ser usados desejar passar a referência de seu objeto remoto para algum método.

Page 11: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Ciclo de vida

Bean não existe

Pool de instancias equivalentes prontas

ejbRemove() Container decide que não precisa mais de tantas instancias

metodo()

1: Class.newInstance()2: ejbSetSessionContext()3: ejbCreate()

Container decide que precisa de mais instancias para servir aos clientes

Qualquer cliente chama um método de negócio em qualquer EJBObject

Page 12: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Exemplo Interfaces Home e Remotepackage org.citi.pec.ejbs;//imports...public interface Loja extends javax.ejb.EJBObject { public Collection listarProdutos() throws RemoteException; //...}

package org.citi.pec.ejbs;//imports...public interface LojaHome extends javax.ejb.EJBHome { public Loja create() throws RemoteException, CreateException; //...}

* Compare o create() do EJBHome com o ejbCreate() do Bean

Page 13: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Exemplo Enterprise JavaBeanpackage org.citi.pec.ejbs;//imports...public class LojaBean implements javax.ejb.SessionBean { private SessionContext sessionContext;

public Collection listarProdutos() { System.out.println("LojaBean.listarProdutos()"); // implementação; } public void ejbCreate() throws CreateException { System.out.println("LojaBean.ejbCreate()"); } public void ejbRemove() { System.out.println("LojaBean.ejbRemove()"); } public void ejbActivate() { System.out.println("LojaBean.ejbActivate()"); } public void ejbPassivate() { System.out.println("LojaBean.ejbPassivate()"); } public void setSessionContext(SessionContext ctx) { this.sessionContext = ctx; System.out.println("LojaBean.setSessionContext()"); }}

Implementação da interface

Page 14: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Exemplo 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> <enterprise-beans> <session> <ejb-name>Loja</ejb-name> <home>org.citi.pec.ejbs.LojaHome</home> <remote>org.citi.pec.ejbs.Loja</remote> <ejb-class>org.citi.pec.ejbs.LojaBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans></ejb-jar>

Page 15: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Exemplo Deployment Descriptor proprietário (JBoss – jboss.xml)

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd">

<jboss> <enterprise-beans> <session> <ejb-name>Loja</ejb-name> <jndi-name>ejb/Loja</jndi-name> </session> </enterprise-beans></jboss>

Page 16: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

...Tudo isso só para um simples Stateless Session Bean?

...Não poderia ser mais simples?

Page 17: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

XDoclet

O que é? É um engine open source gerador de

código Permite programar orientado a atributos

em Java (antes do JDK1.5) utilizando tags especiais de JavaDoc

Desenvolvedor trabalha em apenas um arquivo .java por componente

Page 18: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

XDoclet

Benefícios: Não se preocupar com deployment

descriptors desatualizados Normalmente um simples EJB é

composto por vários arquivos. Com XDoclet, trabalha-se apenas com um e o resto é gerado.

Incrível redução no tempo de desenvolvimento

Page 19: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Exemplopackage org.citi.pec.ejbs;//..importsimport javax.ejb.CreateException;/** * @ejb.bean name="Loja" * display-name="Name for Loja" * description="Description for Loja" * jndi-name="ejb/Loja" * type="Stateless" * view-type="remote" */public class LojaBean implements SessionBean { private SessionContext ctx; public void setSessionContext(SessionContext ctx) throws EJBException, RemoteException { this.ctx = ctx; } public void ejbRemove() throws EJBException, RemoteException {} public void ejbActivate() throws EJBException, RemoteException {} public void ejbPassivate() throws EJBException, RemoteException {} /** * @ejb.create-method */ public void ejbCreate() throws CreateException {} /** * @ejb.interface-method view-type = "remote" */ public Collection listarProdutos() { //...implementação }}

Page 20: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

...O resto é gerado Loja.java/* * Generated by XDoclet - Do not edit! */package org.citi.pec.ejbs;

/** * Remote interface for Loja. * @xdoclet-generated at ${TODAY} * @copyright The XDoclet Team * @author XDoclet * @version ${version} */public interface Loja extends javax.ejb.EJBObject{

public java.util.Collection listarProdutos( ) throws java.rmi.RemoteException;

}

Page 21: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

...O resto é gerado LojaHome.java/* * Generated by XDoclet - Do not edit! */package org.citi.pec.ejbs;

/** * Home interface for Loja. * @xdoclet-generated at ${TODAY} * @copyright The XDoclet Team * @author XDoclet * @version ${version} */public interface LojaHome extends javax.ejb.EJBHome{ public static final String COMP_NAME="java:comp/env/ejb/Loja"; public static final String JNDI_NAME="ejb/Loja";

public org.citi.pec.ejbs.Loja create() throws javax.ejb.CreateException,java.rmi.RemoteException;

}

Page 22: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

...O resto é gerado 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/ejb-jar_2_0.dtd">

<ejb-jar > <description><![CDATA[No Description.]]></description> <display-name>Generated by XDoclet</display-name> <enterprise-beans> <!-- Session Beans --> <session > <description><![CDATA[Description for Loja]]></description> <display-name>Name for Loja</display-name> <ejb-name>Loja</ejb-name> <home>org.citi.pec.ejbs.LojaHome</home> <remote>org.citi.pec.ejbs.Loja</remote> <ejb-class>org.citi.pec.ejbs.LojaBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type>

</session>....

Page 23: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

...O resto é gerado jboss.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.2//EN" "http://www.jboss.org/j2ee/dtd/jboss_3_2.dtd">

<jboss> <enterprise-beans> <!—alguns comentarios gerados-->

<session> <ejb-name>Loja</ejb-name> <jndi-name>ejb/Loja</jndi-name>

<method-attributes> </method-attributes> </session> </enterprise-beans>

<resource-managers> </resource-managers>

</jboss>

Page 24: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Exemplo

Demostração prática: Eclipse + JBossIDE (plugin) + XDoclet

Page 25: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Patterns Session Facade

Aplicar os beneficios do padrão tradicional facade para EJBs

Esconder completamente o modelo dos objetos do servidor da camada do cliente

Implementar um caso de uso por chamada de rede

Page 26: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Patterns Sem Session Facade

Page 27: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Patterns Sem Session Facade

Problemas• Alto overhead da rede• Probre concorrencia (Transações longas)• Alto acoplamento

Page 28: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Patterns Sem Session Facade

Problemas• Alto overhead da rede• Probre concorrencia (Transações longas)• Alto acoplamento• Pobre reusabilidade• Difícil manutenção• Pobre separação de papéis

Page 29: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Patterns Com Session Facade

Page 30: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Patterns Com Session Facade

Benefícios• Baixo overhead da rede• Limpa e estrita separação entre lógica de

negócio e lógica da camada de apresentação• Integridade transacional• Baixo acoplamento• Boa reusabilidade• Melhor manutenção• Limpa separação verbo-nome

Page 31: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Conclusões Stateless Session Beans são os Beans mais

simples Permitem implementar qualquer aplicação

distribuída implementável com RMI Porém, tem seu ciclo de vida controlado pelo

container, além de poderem utilizar os serviços fornecidos por este (autenticação, autorização, transações, etc.)

*Não defina atributos de instâncias em Stateless Session Beans!

Page 32: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

E mais...

A partir da especificação 2.1 dos EJBs, Stateless Session Beans podem prover interfaces de Web Services para clientes

Page 33: Session Beans Ricardo Cavalcanti roc3@cin.ufpe.br Jobson Ronan jrjs@cin.ufpe.br

Referências

[1] Ed Roman, Mastering EJB 3, 2002, Capítulo 4

[2] Dale Green. Session Beans. J2EE Tutorial, Sun

[3] Linda G. deMichiel et al. Enterprise JavaBeans™ 2.1 Specification. Sun Microsystems, 2003

[4] XDoclet, Doc for 1.2.2-RC1. http://xdoclet.sourceforge.net/