A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Stateful Session Beans Carrinho de compras corporativo Ricardo Cavalcanti Jobson Ronan

Apresentações semelhantes


Apresentação em tema: "Stateful Session Beans Carrinho de compras corporativo Ricardo Cavalcanti Jobson Ronan"— Transcrição da apresentação:

1 Stateful Session Beans Carrinho de compras corporativo Ricardo Cavalcanti Jobson Ronan

2 Por que?  Quando um cliente chama um metodo de um bean ele esta iniciando um dialogo  Assim, o estado do dialogo precisa ser mantido para a próxima chamada  Logo, o Container não pode fazer o mesmo tipo de “pooling” que faz com os beans Stateless  Solução: passivação e ativação

3 Passivação e ativação  Semelhante ao processo de paginação efetuado pelo sistema operacional  Dados do bean são armazanados durante a passivação e recuperados na ativação  Permite manter poucas instancias no ar atendendo a vários clientes  O Container decide quais beans serão passivados.  Estratégia mais comum: LRU – Last Recently Used  Se o Container precisar de mais recursos o bean a menos tempo usado será passivado  O bean será serializado, assim, farão parte do dialogo apenas objetos e variáveis não transientes!

4 Stateful Session Beans  Precisam implementar a mesma interface que Steteless Session Beans  Porém, algumas operações agora farão sentido void ejbPassivate() –Chamado antes do container fazer o swap do Bean. void ejbActivate() –Chamado depois do container recuperar o bean do disco.

5 Stateful Session Beans  Se a mais clientes realizando operações contínuas que beans no pool, container pode criar mais instancias  Se há mais clientes que beans no pool mas uma boa parte permanece inativa por certos períodos (cenário realista) o container gerencia os recursos utilizando ativação e passivação  O Administrador do sistema pode configurar o servidor para obter melhor desempenho (deployment descriptor)

6 Ciclo de Vida Bean não existe Bean ativo Bean inativo 1: Class.newInstance() 2: ejbSetSessionContext() 3: ejbCreate(...) Cliente chama create(...) na interface home metodo() Qualquer cliente chama um método de negócio em qualquer EJBObject ejbPassivate() ejbActivate() Qualquer cliente chamou um método de negócio em um bean inativo. Container precisa ativar o bean Limite de beans do container atingido Cliente chama remove ou a sessão expirou ejbRemove() Time out

7 Exemplo package org.citi.pec.ejbs; //..imports /** name="Calculator" * display-name="Name for Calculator" * description="Description for Calculator" * jndi-name="ejb/Calculator" * type="Stateful" * view-type="remote" */ public class CalculatorBean implements SessionBean { private BigDecimal memory = BigDecimal.ZERO; public void setSessionContext(SessionContext ctx) throws EJBException, RemoteException { } public void ejbRemove() throws EJBException, RemoteException { System.out.println("CalculatorBean.ejbRemove()"); } public void ejbActivate() throws EJBException, RemoteException { System.out.println("CalculatorBean.ejbActivate()"); } public void ejbPassivate() throws EJBException, RemoteException { System.out.println("CalculatorBean.ejbPassivate()"); }

8 Exemplo //continuação /** */ public void ejbCreate() throws CreateException { System.out.println("CalculatorBean.ejbCreate()"); } /** view-type = "remote" */ public double add(double value) { memory = memory.add(new BigDecimal(value)); return memory.doubleValue(); } /** view-type = "remote" */ public double mult(double value) { memory = memory.multiply(new BigDecimal(value)); return memory.doubleValue(); }

9 Exemplo  Para demonstrar o efeito ejbActivate() e ejbPassivate() vamos reduzir o tamando da cache do bean artificialmente para a capacidade máxima de 2 beans  Jboss.xml Calculator ejb/Calculator myEjbsConf myEjbsConf org.jboss.ejb.plugins.LRUStatefulContextCachePolicy 2

10 Exemplo  Em execução...

11 ejbCreate() e create()  Para cada create() na interface Home deve haver um ejbCreate() no bean  Com número e tipo dos parâmetros idênticos  Cada create() na interface Home retorna o tipo da interface do componente  Cada ejbCreate() no bean retorna void  Ambos lançam as mesmas exceções( exceto RemoteException que só é lançada na interface Home remota) ...XDoclet faz isso para nós!

12 Exercício (1)  Altere o tipo do bean Calculadora de Stateful para Stateless, rode a aplicação novamente e discuta os resultados

13 Exercício (2)  (a) Implemente um Session Bean com a seguinte interface O Bean mantém uma String com Produtos por linha listarProdutos() retorna a String adicionarProduto concatena a String  Faça o deploy Carrinho +adicionarProduto(String) +listarProdutos():String

14 Clientes  Para acessar um Ejb é necessário encontralo (lookup) no servidor  Faz-se o lookup da interface home ao servidor JNDI Context ctx; //..obenten-se o contexto do servidor de nomes Object o = ctx.lookup("ejb/Calculator");  Caso a interface procurada seja a local, o retorno do lookup já é esta CalculatorLocalHome calculator = ctx.lookup("ejb/Calculator");

15 Clientes  Caso a interface procurada seja a remota, o retorno do lookup é um objeto RMI-IIOP. Assim, é necessário efetuar um “cast” especial Object o = ctx.lookup("ejb/Calculator"); CalculatorHome calculatorHome = (CalculatorHome) PortableRemoteObject.narrow(o, CalculatorHome.class);  De posse da interface home desejada, basta chamar o create() para obter acessor a interface do bean

16 Clientes  Obtendo (configurando) o contexto JNDI  Arquivo “jndi.properties” no classpath  Configuração programática Context ctx = new InitialContext(); Hashtable props = new Hashtable(); props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); props.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); props.put(Context.PROVIDER_URL, "jnp://localhost:1099"); Context ctx = new InitialContext(props);

17 Exercício (2)  Crie um cliente para o Carrinho  Crie dois carrinhos  Preencha ambos com 3 ou 4 produtos diferentes  Liste o conteúdo de ambos

18 Exercício (3)  Carrinho de compras usando Produto  Implemente um Stateful Session Bean que mantém na memória uma coleção de Produtos  O Bean deve ter a seguinte interface e utilizar o objeto Produto public Produto[] listarConteudoCarrinho(); public void adicionarProduto(Produto produto); public void removerProduto(String cod); public Produto detalharProduto(String cod);  Faça o deploy  Crie um cliente semelhante ao do Carrinho  Após rodar o cliente, altere o Bean para Stateles e rode novamente e comente os resultados

19 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 RC1.


Carregar ppt "Stateful Session Beans Carrinho de compras corporativo Ricardo Cavalcanti Jobson Ronan"

Apresentações semelhantes


Anúncios Google