SessionBeans Marco Antonio Arquiteto de Software Introdução Componentes reutilizáveis que processam a regra do negócio. Contém métodos que representam ações (validarCpf, adicionarProduto, listarUsuarios). Seu ciclo de vida se resume a uma sessão. São objetos transientes, pois não são persistidos. O que é importante J2EE é uma especificação bastante completa, prevendo todas as situações possíveis. Na prática, a maioria dessas situações é evitada, pois vamos usar boas práticas de programação, estratégias amplamente difundidas (padrões de projeto). Nosso exemplo será direcionado a uma típica aplicação EJB, sem a imensa maioria dos detalhes que fazem parte da teoria da especificação. Tipos de session beans Stateless – não mantém o valor dos atributos entre chamadas. É compartilhado entre clientes. Statefull – mantém o valor dos atributos entre chamadas. Consome muita memória, pois é criado um objeto para cada cliente. Não recomendado para sistemas corporativos. Aplicações J2EE • Construir aplicações J2EE de boa qualidade exige conhecimento de: – Design patterns – Frameworks – Detalhes do funcionamento do AppServer Aplicações J2EE • Aplicações J2EE geram muito código (interfaces home, remote, local) • Criar descritores EJB e WEB • Construir classes de apoio e utilitários Aplicações J2EE • Utilize ferramentas como XDoclet, Ant, NetBeans, Eclipse • Automatize o máximo que conseguir Aplicações J2EE • Trabalhar com equipes heterogêneas, muitas vezes terceirizadas, requer esforço extra para garantir código de boa qualidade XDoclet • Para automatizar o processo de desenvolvimento iremos utilizar o XDoclet • Na figura podemos ver as configurações necessárias O projeto • Vamos criar nosso projeto J2EE conforme o exemplo Projeto de exemplo • O nome do projeto é SistemaBancario • As demais configurações podem ser conferidas na figura a seguir New Server • Configuração do servidor de aplicação Diretório do JBoss • Informe o diretório raíz do JBoss Configuração • Dados sobre endereço IP, porta do servidor, porta do JNDI e tipo de configuração do servidor Facets • Mude a versão do Java para 5.0 Projeto cliente • Uma boa maneira de organizar o projeto é a criação de vários subprojetos • Nesse exemplo serão três: – SistemaBancario (núcleo da aplicação) – SistemaBancarioCliente (classes do cliente) – SistemaBancarioEAR (dados da aplicação) Configurações do XDoclet • No menu Window -> Preferences, vamos configurar algumas propridades do XDoclet ejbdoclet • Clique na opção JBoss -> Edit webdoclet • Clique na opção JBoss -> Edit Criação de EJB • O mecanismo padrão para geração de EJB é o XDoclet • Por isso é a única opção disponível Session bean • EJB da camada de negócio • Responsável pelas regras de negócio da aplicação EJB • Dados da classe (projeto, package, nome) EJB • Dados dos arquivos de configuração • Esses nomes serão registrados no JBoss EJB • Desmarque a opção “Abstract” • Nosso primeiro EJB está pronto Estrutura de arquivos • A única classe que criamos foi a FachadaContaCorrente Bean • Todas as demais foram geradas pelo XDoclet de forma automatizada Servidor • Mude para a perpectiva Java EE • Abra a guia Servers e clique com o botão direito do mouse no servidor disponível Projetos • Adicione nosso projeto no servidor Configuração de startup • No menu Run -> Open Run Dialog temos as configurações de memória do servidor • Esse tipo de informação faz parte do tuning da aplicação (ajuste fino) • Uma alternativa é deixar tudo em branco Start do servidor • Clique no botão “Start the server” e acompanhe as mensagens Arquivos gerados jndi.properties • Esse arquivo de propriedades indica os dados do servidor que tem os serviços disponíveis jndi.properties # java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=jnp://localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces Cliente • O último passo é a criação do cliente que irá acessar o serviço criado Cliente package net.sistemabancario.negocio.cliente; import javax.naming.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import net.sistemabancario.negocio.FachadaContaCorrente; import net.sistemabancario.negocio.FachadaContaCorrenteHome; public class FachadaContaCorrenteCliente { public static void main(String[] args) { try { Context ctx = new InitialContext(); Object obj = ctx.lookup(FachadaContaCorrenteHome.JNDI_NAME); FachadaContaCorrenteHome home = (FachadaContaCorrenteHome) PortableRemoteObject.narrow(obj, FachadaContaCorrenteHome.class); FachadaContaCorrente fachada = home.create(); fachada.foo(""); } catch (Exception e) { e.printStackTrace(); } } } Novo método da fachada /** * @ejb.interface-method view-type = "remote" */ public void sacar(String numeroDaConta, Double valorSacado) { System.out.println("Número da conta: " + numeroDaConta); System.out.println("Valor sacado: " + valorSacado); } Publishing • Quando o status do servidor estiver diferente de Synchronized você deve publicar a aplicação de novo Mensagem de deploy • O diretório de deploy do JBoss está listado logo abaixo Cliente v2.0 package net.sistemabancario.negocio.cliente; import javax.naming.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import net.sistemabancario.negocio.FachadaContaCorrente; import net.sistemabancario.negocio.FachadaContaCorrenteHome; public class FachadaContaCorrenteCliente { public static void main(String[] args) { try { Context ctx = new InitialContext(); Object obj = ctx.lookup(FachadaContaCorrenteHome.JNDI_NAME); FachadaContaCorrenteHome home = (FachadaContaCorrenteHome) PortableRemoteObject.narrow(obj, FachadaContaCorrenteHome.class); FachadaContaCorrente fachada = home.create(); fachada.foo(""); fachada.sacar(“7594-9”, 350.0); } catch (Exception e) { e.printStackTrace(); } } } Execução do cliente • Você pode rodar o JBoss dentro do Eclipse ou direto no console (bem mais rápido, mas sem debug) Saída no console Dúvidas?