Programação e Configuração de Aplicações JEE Edilmar Alves
Palestrante Sócio da InterSite Informática Professor Universitário Coordenador do JUGMS e membro do BrazilJUGs Fã de Linux, Java e outros softwares livres
Sumário Estruturação do Projeto Pacote básico de frameworks JSF2 + CDI + CODI JPA + JTA Webservices Timers Configurações do GlassFish Profiling Conclusão
Estruturação do Projeto O que é uma Aplicação JEE? Interface Cliente Servidor de Aplicações JEE Banco de Dados Aplicação JEE não é necessariamente com interface CLIENTE = WEB! Cliente em qualquer lugar + webservices (SOAP ou REST)
Estruturação do Projeto Interface: Desktop (Swing, JavaFX, etc) Mobile (Android, ios, WinPhone, etc) Web (framework JS, JSF, etc) Aplicação Servidora: Webservices Controllers JSF Servidor JEE: GlassFish, JBoss, TomEE, etc
Estruturação do Projeto Foco: JSF + Controllers + GlassFish Pastas da Interface: Principal (xhtmls JSF) /js (Javascript) /css (layout) /imagens /WEB-INF/templates (padrões de layout JSF)
Estruturação do Projeto Pacotes Java: control: Controllers JSF dao: operações no BD entity: mapeamentos de tabelas do BD util: outras classes úteis em geral
Pacote básico de Frameworks IDE (NetBeans, Eclipse) Servidor de Aplicações embutido na IDE JSF + {Rich Prime My}faces: controle da interface CDI: injeção de dependências public class CidadeController { @Inject CidadeDAO dao; } public class CidadeJpaDAO implements CidadeDAO { @PersistenceContext(unitName= BD ) EntityManager em; }
Pacote básico de Frameworks CDI possui alguns bugs, problemas de desempenho e alocação de memória, e uma certa lentidão no desenvolvimento CODI: extensões ao projeto CDI, feito pela Apache/Myfaces Fácil integração em projetos já existentes com JSF e CDI Resolve vários problemas do CDI
Pacote básico de Frameworks ConversationScoped: Novo escopo do CDI Maior que RequestScoped Menor que SessionScoped Ideal para telas CRUD @Inject Conversation conversation; Entrar na tela: conversation.begin(); Continuar após inserir/alterar/remover Sair da tela: conversation.end(); PARECE SIMPLES!!!
Pacote básico de Frameworks CODI ConversationScoped: Não requer conversation.begin(); Gerencia melhor os objetos da conversação, evitando bugs de AJAX dos Frameworks JSF (RichFaces,PrimeFaces) Tela CRUD sem botão Sair + Menu Principal
Pacote básico de Frameworks Tela CRUD sem botão Sair + Menu Principal CDI não sabe que saiu da tela, apenas que entrou na outra Se fizer na entrada da outra end() + begin(), não elimina objetos da conversação anterior PROBLEMA: Consumo excessivo de RAM SOLUÇÃO: no JSF, ao acionar cada opção de menu, chamar método do CODI para fechar conversação do controller atual conversation.close();
Pacote básico de Frameworks JPA: camada de persistência de objetos em BDs de forma padronizada no Java Hibernate, EclipseLink, etc: implementações de persistência usadas pelo JPA JTA: Gerenciamento de transações com o BD Integrado aos servidores de aplicações CDI injeta objetos de sessão e de transação do BD @PersistenceContext(unitName= BD ) EntityManager em; @Resource UserTransaction ut;
Webservices Implementação no servidor Comunicação por XML sobre HTTP Interfaces SOAP ou REST SOAP: REST: Mais comum entre sistemas de diferentes fornecedores XML de comunicação maior Mais novo, XML menor, mais simples de desenvolver
Webservices É possível programar de tal forma que Controllers JSF usem código comum com Webservices Permitir várias interfaces clientes com pouco código adicional Cuidado com situações específicas de cada interface!!! 1. Como retornar mensagens de aviso ou erro para o usuário final na interface cliente??? 2. Como armazenar o contexto de objetos???
Timers Executam em data/hora pré-determinada no servidor de aplicações Semelhante a uma Tarefa Agendada/Windows ou Crontab/Linux Pode ser definida a data/hora por anotação: @Schedule(dayOfWeek="Sun", hour="0")
Timers Mais flexível no arquivo WEB-INF/ejb-jar.xml <timer> <schedule> <second>0</second> <minute>0</minute> <hour>1</hour> <month>*</month> <year>*</year> </schedule>... </timer>
Timers Não possui interface cliente Aviso de término por email, arquivo de log, etc Uso: Tarefas longas e automatizadas fora do expediente, como geração de relatórios gerenciais Troca de informações com outros sistemas Monitoramento de dados
Configurações do GlassFish Básico Next-Next-Finish Porta 4848: Admin Console Porta 8080: aplicações Configurações Default-config Configurações da JVM: -client => -server -XX:MaxPermSize=192m -Xmx512m
Configurações do GlassFish Básico Next-Next-Finish Porta 4848: Admin Console Porta 8080: aplicações Configurações Default-config Configurações da JVM: -client => -server -XX:MaxPermSize=192m -Xmx512m
Configurações do GlassFish Configurações Default-config Configurações de Rede Escutas de Rede http-listener-1: Aba HTTP: Compactação = On Tipos MIME compactáveis = text/html,text/xml,text/plain,text/css,text/javascript,application/json,text/xhtml Aba Cache de arquivos: Status = Ativado
Configurações do GlassFish Recursos JDBC: Grupos de Conexões JDBC: Pools de Conexão, cuidado para analisar números mínimo/máximo de conexões, e os tempos de reciclagem Recursos do JDBC: nomes correspondentes aos pools, que são usados no código para injetar EntityManager e UserTransaction (JTA) Sessões JavaMail: mesma idéia dos Recursos JDBC, mas para pool de conexões com servidor de email Outros: JMS, JNDI,...
Profiling Analisar gargalos de CPU, RAM, disco, etc, em uma aplicação JVisualVM: ferramenta nativa do JDK para monitoramento de aplicações Pode-se monitorar o GlassFish e sua aplicação
Profiling
Profiling
Profiling
Conclusão Uma alternativa viável = JSF/{Rich Prime}Faces + CDI/CODI + JPA/JTA/Hibernate + GlassFish Desenvolver = juntar peças certas (frameworks + servidor + SEU conhecimento)