Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
Este documento fornece um tutorial sobre a tecnologia Java Persistence API (JPA) de acordo com a especificação Java EE 7. Resume os principais conceitos de JPA como mapeamento objeto-relacional, configuração da camada de persistência e exemplos de mapeamento de entidades usando anotações ou arquivos XML. Também fornece informações sobre exercícios práticos que serão realizados usando diferentes provedores de persistência e bancos de dados.
O documento discute estratégias de comunicação distribuída, incluindo EJB. Ele lista vários tipos de comunicação em sistemas distribuídos como sockets, RMI, CORBA, EJB e serviços Web. O documento também discute instalação e configuração do JBoss e conceitos relacionados a JEE, como EJB, entidades e unidades de persistência.
Este documento fornece um resumo sobre WebServlets de acordo com a especificação Java EE 7. Ele contém informações sobre aplicações Web, WebServlets, requisições e respostas HTTP, URLs e redirecionamento, contexto da aplicação, sessão do cliente, filtros interceptadores e arquitetura MVC.
O documento resume as principais mudanças na arquitetura modular introduzida no Java 9, incluindo:
1) A divisão do JDK e JRE em módulos menores com dependências explícitas;
2) A capacidade de criar aplicações modulares com dependências claras entre módulos;
3) As novas funcionalidades como a geração de imagens executáveis menores com jlink.
Victor Hazin é um engenheiro de software e professor com mais de 10 anos de experiência. Ele possui graduação e mestrado em Ciências da Computação pela UFPE.
O documento descreve o framework Spring Security para controle de acesso em sistemas Java. Ele fornece funcionalidades como autenticação HTTP e HTTPS, controle de acesso a métodos e tipos de autenticação como OpenID, LDAP e banco de dados. O documento também explica como configurar o Spring Security para proteger URLs, trocar usuários e senhas padrão e customizar formulários de login.
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
Este documento fornece um tutorial sobre a tecnologia Java Persistence API (JPA) de acordo com a especificação Java EE 7. Resume os principais conceitos de JPA como mapeamento objeto-relacional, configuração da camada de persistência e exemplos de mapeamento de entidades usando anotações ou arquivos XML. Também fornece informações sobre exercícios práticos que serão realizados usando diferentes provedores de persistência e bancos de dados.
O documento discute estratégias de comunicação distribuída, incluindo EJB. Ele lista vários tipos de comunicação em sistemas distribuídos como sockets, RMI, CORBA, EJB e serviços Web. O documento também discute instalação e configuração do JBoss e conceitos relacionados a JEE, como EJB, entidades e unidades de persistência.
Este documento fornece um resumo sobre WebServlets de acordo com a especificação Java EE 7. Ele contém informações sobre aplicações Web, WebServlets, requisições e respostas HTTP, URLs e redirecionamento, contexto da aplicação, sessão do cliente, filtros interceptadores e arquitetura MVC.
O documento resume as principais mudanças na arquitetura modular introduzida no Java 9, incluindo:
1) A divisão do JDK e JRE em módulos menores com dependências explícitas;
2) A capacidade de criar aplicações modulares com dependências claras entre módulos;
3) As novas funcionalidades como a geração de imagens executáveis menores com jlink.
Victor Hazin é um engenheiro de software e professor com mais de 10 anos de experiência. Ele possui graduação e mestrado em Ciências da Computação pela UFPE.
O documento descreve o framework Spring Security para controle de acesso em sistemas Java. Ele fornece funcionalidades como autenticação HTTP e HTTPS, controle de acesso a métodos e tipos de autenticação como OpenID, LDAP e banco de dados. O documento também explica como configurar o Spring Security para proteger URLs, trocar usuários e senhas padrão e customizar formulários de login.
Aula 2 - POO: Fundamentos da linguagem JavaDaniel Brandão
Aula 2 da disciplina Programação Orientada a Objetos, onde é apresentando o conceito inicial da linguagem JAVA, que será a base da aplicação prática na disciplina.
Palestra ministrada na Trilha DevTest do The Developers Conference 2019 em Florianópolis sobre automação de testes de API com RestAssured e virtualização de serviços com Wiremock
O documento apresenta uma introdução à programação orientada a objetos na linguagem Java, abordando tópicos como: a história e evolução do Java desde sua criação em 1991; as principais distribuições da linguagem (JSE, JEE, JME); a máquina virtual Java e o compilador; e um exemplo simples de um programa "Hello World" em Java.
O documento apresenta uma introdução sobre qualidade e teste de software, abordando:
1) Definições de qualidade, teste de software, verificação e validação;
2) Papéis e perfis dos profissionais de teste;
3) Técnicas para derivar casos de teste a partir de casos de uso.
O documento apresenta uma introdução sobre JavaScript, descrevendo-o como uma linguagem de programação utilizada para criar pequenos programas que realizam ações em páginas web. Em seguida, explica conceitos básicos como estrutura de scripts, uso de funções como document.write(), caixas de diálogo e conversão de variáveis. Por fim, aborda brevemente objetos, eventos e funções.
This is a basic tutorial on Spring core.
Best viewed when animations and transitions are supported, e.g., view in MS Powerpoint. So, please try to view it with animation else the main purpose of this presentation will be defeated.
Introdução à Qualidade e Testes Ágeis de SoftwareClaudia Melo
1. O documento introduz os conceitos de qualidade e testes de software, discutindo a importância da qualidade e os tipos de testes como unidade, integração, interface do usuário e aceitação.
2. São abordados conceitos como defeito, erro e falha, além de técnicas de verificação e validação como análise estática e dinâmica para avaliar a qualidade do software.
3. São apresentados diferentes tipos de testes para avaliar o software como teste de unidade, integração, desempenho, estresse e segurança.
O documento apresenta o plano de teste para um sistema de e-commerce. Ele descreve a abordagem de testes, incluindo a categorização de requisitos funcionais e não funcionais, detalhamento dos tipos de testes a serem realizados e ambientes de teste. Os testes funcionais serão focados em validar os principais requisitos funcionais do sistema, como cadastro, alteração, busca, exclusão de usuários e produtos, compras e geração de relatórios.
O documento apresenta uma introdução ao Robot Framework, um framework de automação de testes open source baseado em Python. A palestra discute os conceitos-chave do Robot Framework, incluindo sua arquitetura baseada em keywords, estrutura de arquivos e seções, tipos de testes suportados e como executar testes. Além disso, apresenta exemplos de keywords e bibliotecas comuns utilizadas para testes web.
De a máxima cobertura nos seus testes de APIElias Nogueira
Palestra ministrada no Reginonal Scrum Gathering Rio 2019 no dia 27/06/2019 sobre como dar uma cobertura de testes para uma API além do teste unitário e de integração, com um foco totalmente prático e com execução em pipeline.
**** Java Certification Training: https://www.edureka.co/java-j2ee-soa-training ****
This Edureka tutorial on “Advanced Java” will talk about 3 main concepts i.e. JAVA Database Connectivity, Servlets, and Java Server Pages. It will also talk about the various features, connections, statements, advantages, and need for advanced Java etc. Through this tutorial you will learn the following topics:
Introduction to J2EE
JDBC Architecture
JDBC Connections
JDBC Statements
Introduction to servlets
Servlet Life Cycle
Steps to create Servlet in Eclipse
Session Tracking and Cookies
Introduction to Java Server Pages
JSP Life Cycle
JSP Scripting Elements
Check out our Java Tutorial blog series: https://goo.gl/osrGrS
Check out our complete Youtube playlist here: https://goo.gl/gMFLx3
Follow us to never miss an update in the future.
Instagram: https://www.instagram.com/edureka_learning/
Facebook: https://www.facebook.com/edurekaIN/
Twitter: https://twitter.com/edurekain
LinkedIn: https://www.linkedin.com/company/edureka
O documento fornece um resumo sobre o framework Spring, descrevendo:
1) Por que foi criado o Spring para substituir o EJB do Java EE, tornando o desenvolvimento Java mais leve e flexível;
2) Os principais conceitos do Spring como injeção de dependência e gerenciamento de beans;
3) As principais partes do framework Spring e projetos relacionados como Spring Boot, Spring MVC e Spring Data.
O documento descreve os princípios da Clean Architecture, uma estratégia arquitetural que promove o desacoplamento entre as regras de negócio de uma aplicação e recursos externos. A Clean Architecture define camadas lógicas com entidades, casos de uso e adaptadores de interface que isolam as regras de negócio de tecnologias como bancos de dados e frameworks. Isso permite mudanças nesses recursos sem afetar o código de domínio e aumenta a testabilidade.
Spring Boot is a framework for creating stand-alone, production-grade Spring based applications that can be "just run". It aims to provide a radically faster and widely accessible starting experience for developing Spring applications. Spring Boot applications can be started using java -jar or traditional WAR deployments and require very little Spring configuration. The document then discusses system requirements, development environment, creating a simple Hello World application, using Spring Boot Admin to monitor applications, configuring databases, Spring Data JPA, REST controllers, caching with EhCache, building web applications with Thymeleaf, and project structure.
Update:
Video available from Oredev: vimeo.com/53147485
Metaprogramming is the dirty little secret behind the success of many Java frameworks such as Spring and Struts2, and constitutes the backbone of many of the most fundamental APIs across the JEE technology stack. This session aims introduce the topic and highlight, with code examples, the different mechanisms and techniques to take advantage of this underused feature of the Java Programming Language.
This session will adopt a learn-by-example approach that combines the philosophy and theory behind metaprogramming with concrete code examples. The audience will be walked real-life scenarios to highlight the benefits of this technique such as minimizing the number of lines of code, reduced development time, and greater flexibility, etc… Design patterns, and best practices will be picked up along the way.
No previous knowledge or exposure to the topic is required, but an intermediate understanding of Java SE is expected.
O documento resume os principais conceitos de EJB, incluindo: 1) EJB são componentes padrão do lado do servidor para aplicações distribuídas e escaláveis; 2) Bean de Entidade usam JPA para mapear classes para tabelas de banco de dados; 3) Session Beans podem ser stateless, stateful ou MDBs e fornecem serviços para aplicações.
Este documento discute conceitos e modelos de programação do CDI, incluindo:
1) Tipos de beans, qualificadores, escopos, nomes EL, alternativas e estereótipos.
2) Métodos produtores, campos produtores e recursos como formas de fornecer instâncias de beans.
3) Inicializadores, beans @New e quando um bean está habilitado.
Aula 2 - POO: Fundamentos da linguagem JavaDaniel Brandão
Aula 2 da disciplina Programação Orientada a Objetos, onde é apresentando o conceito inicial da linguagem JAVA, que será a base da aplicação prática na disciplina.
Palestra ministrada na Trilha DevTest do The Developers Conference 2019 em Florianópolis sobre automação de testes de API com RestAssured e virtualização de serviços com Wiremock
O documento apresenta uma introdução à programação orientada a objetos na linguagem Java, abordando tópicos como: a história e evolução do Java desde sua criação em 1991; as principais distribuições da linguagem (JSE, JEE, JME); a máquina virtual Java e o compilador; e um exemplo simples de um programa "Hello World" em Java.
O documento apresenta uma introdução sobre qualidade e teste de software, abordando:
1) Definições de qualidade, teste de software, verificação e validação;
2) Papéis e perfis dos profissionais de teste;
3) Técnicas para derivar casos de teste a partir de casos de uso.
O documento apresenta uma introdução sobre JavaScript, descrevendo-o como uma linguagem de programação utilizada para criar pequenos programas que realizam ações em páginas web. Em seguida, explica conceitos básicos como estrutura de scripts, uso de funções como document.write(), caixas de diálogo e conversão de variáveis. Por fim, aborda brevemente objetos, eventos e funções.
This is a basic tutorial on Spring core.
Best viewed when animations and transitions are supported, e.g., view in MS Powerpoint. So, please try to view it with animation else the main purpose of this presentation will be defeated.
Introdução à Qualidade e Testes Ágeis de SoftwareClaudia Melo
1. O documento introduz os conceitos de qualidade e testes de software, discutindo a importância da qualidade e os tipos de testes como unidade, integração, interface do usuário e aceitação.
2. São abordados conceitos como defeito, erro e falha, além de técnicas de verificação e validação como análise estática e dinâmica para avaliar a qualidade do software.
3. São apresentados diferentes tipos de testes para avaliar o software como teste de unidade, integração, desempenho, estresse e segurança.
O documento apresenta o plano de teste para um sistema de e-commerce. Ele descreve a abordagem de testes, incluindo a categorização de requisitos funcionais e não funcionais, detalhamento dos tipos de testes a serem realizados e ambientes de teste. Os testes funcionais serão focados em validar os principais requisitos funcionais do sistema, como cadastro, alteração, busca, exclusão de usuários e produtos, compras e geração de relatórios.
O documento apresenta uma introdução ao Robot Framework, um framework de automação de testes open source baseado em Python. A palestra discute os conceitos-chave do Robot Framework, incluindo sua arquitetura baseada em keywords, estrutura de arquivos e seções, tipos de testes suportados e como executar testes. Além disso, apresenta exemplos de keywords e bibliotecas comuns utilizadas para testes web.
De a máxima cobertura nos seus testes de APIElias Nogueira
Palestra ministrada no Reginonal Scrum Gathering Rio 2019 no dia 27/06/2019 sobre como dar uma cobertura de testes para uma API além do teste unitário e de integração, com um foco totalmente prático e com execução em pipeline.
**** Java Certification Training: https://www.edureka.co/java-j2ee-soa-training ****
This Edureka tutorial on “Advanced Java” will talk about 3 main concepts i.e. JAVA Database Connectivity, Servlets, and Java Server Pages. It will also talk about the various features, connections, statements, advantages, and need for advanced Java etc. Through this tutorial you will learn the following topics:
Introduction to J2EE
JDBC Architecture
JDBC Connections
JDBC Statements
Introduction to servlets
Servlet Life Cycle
Steps to create Servlet in Eclipse
Session Tracking and Cookies
Introduction to Java Server Pages
JSP Life Cycle
JSP Scripting Elements
Check out our Java Tutorial blog series: https://goo.gl/osrGrS
Check out our complete Youtube playlist here: https://goo.gl/gMFLx3
Follow us to never miss an update in the future.
Instagram: https://www.instagram.com/edureka_learning/
Facebook: https://www.facebook.com/edurekaIN/
Twitter: https://twitter.com/edurekain
LinkedIn: https://www.linkedin.com/company/edureka
O documento fornece um resumo sobre o framework Spring, descrevendo:
1) Por que foi criado o Spring para substituir o EJB do Java EE, tornando o desenvolvimento Java mais leve e flexível;
2) Os principais conceitos do Spring como injeção de dependência e gerenciamento de beans;
3) As principais partes do framework Spring e projetos relacionados como Spring Boot, Spring MVC e Spring Data.
O documento descreve os princípios da Clean Architecture, uma estratégia arquitetural que promove o desacoplamento entre as regras de negócio de uma aplicação e recursos externos. A Clean Architecture define camadas lógicas com entidades, casos de uso e adaptadores de interface que isolam as regras de negócio de tecnologias como bancos de dados e frameworks. Isso permite mudanças nesses recursos sem afetar o código de domínio e aumenta a testabilidade.
Spring Boot is a framework for creating stand-alone, production-grade Spring based applications that can be "just run". It aims to provide a radically faster and widely accessible starting experience for developing Spring applications. Spring Boot applications can be started using java -jar or traditional WAR deployments and require very little Spring configuration. The document then discusses system requirements, development environment, creating a simple Hello World application, using Spring Boot Admin to monitor applications, configuring databases, Spring Data JPA, REST controllers, caching with EhCache, building web applications with Thymeleaf, and project structure.
Update:
Video available from Oredev: vimeo.com/53147485
Metaprogramming is the dirty little secret behind the success of many Java frameworks such as Spring and Struts2, and constitutes the backbone of many of the most fundamental APIs across the JEE technology stack. This session aims introduce the topic and highlight, with code examples, the different mechanisms and techniques to take advantage of this underused feature of the Java Programming Language.
This session will adopt a learn-by-example approach that combines the philosophy and theory behind metaprogramming with concrete code examples. The audience will be walked real-life scenarios to highlight the benefits of this technique such as minimizing the number of lines of code, reduced development time, and greater flexibility, etc… Design patterns, and best practices will be picked up along the way.
No previous knowledge or exposure to the topic is required, but an intermediate understanding of Java SE is expected.
O documento resume os principais conceitos de EJB, incluindo: 1) EJB são componentes padrão do lado do servidor para aplicações distribuídas e escaláveis; 2) Bean de Entidade usam JPA para mapear classes para tabelas de banco de dados; 3) Session Beans podem ser stateless, stateful ou MDBs e fornecem serviços para aplicações.
Este documento discute conceitos e modelos de programação do CDI, incluindo:
1) Tipos de beans, qualificadores, escopos, nomes EL, alternativas e estereótipos.
2) Métodos produtores, campos produtores e recursos como formas de fornecer instâncias de beans.
3) Inicializadores, beans @New e quando um bean está habilitado.
Enterprise Java Beans (EJB) são componentes que encapsulam a lógica de negócios de uma aplicação e residem em um container EJB. EJBs simplificam o desenvolvimento de aplicações grandes e distribuídas fornecendo serviços como gestão de transações e segurança. Existem dois tipos principais de EJB: Session Beans, que encapsulam lógica de negócios invocada por clientes, e Message-Driven Beans, que processam mensagens assíncronas.
O documento descreve os conceitos de Stateful Session Beans no Java EE, incluindo: 1) Stateful Session Beans mantêm estado entre chamadas de método através de ativação e passivação; 2) Métodos como ejbCreate(), ejbRemove(), ejbPassivate() e ejbActivate() são implementados; 3) O ciclo de vida de um Stateful Session Bean é gerenciado pelo container.
O documento discute a camada de apresentação com Java Server Faces 2.0, descrevendo suas principais características e componentes, como tags JSF Core e ciclo de vida de requisições, além de mostrar como adicionar JSF à camada de apresentação em projetos Spring Roo.
O documento discute os conceitos de J2EE e EJB 3.0. Especificamente, descreve o que é J2EE, suas características e o que é EJB, seus tipos de componentes (session bean, entity bean e message-driven bean), interfaces e como implementar um bean.
Este documento fornece um resumo introdutório sobre Enterprise JavaBeans 3.0, incluindo sessão beans, message-driven beans, transações e interceptadores. O programa abrange esses tópicos além de web services. O objetivo é fornecer uma introdução prática a EJB 3.0 com demonstrações.
Este documento fornece uma introdução aos principais componentes e conceitos dos Enterprise JavaBeans (EJB), incluindo:
1) Os componentes necessários para implantar um EJB corretamente são uma classe bean, interfaces, descritor de implantação.
2) As classes bean implementam a lógica de negócios e podem acessar o contexto do EJB através da interface EJBContext.
3) Os interceptadores EJBObject e EJBHome gerados pelo container permitem acesso remoto e local aos beans e implementam serviços do EJB.
O documento discute estratégias de comunicação distribuída e lista diferentes tipos de comunicação em sistemas distribuídos, incluindo EJB. O documento também fornece detalhes sobre instalação e configuração do JBoss para implantar aplicativos Java EE.
Este documento descreve uma aplicação J2EE completa como exemplo para um laboratório sobre EJB e J2EE. A aplicação simula uma loja online simples com relacionamentos entre entidades como Produto, Cliente e Compra. Inclui entity beans, session beans, message-driven beans, tabelas no banco de dados, interfaces, deploy e testes de clientes.
O documento introduz o framework JavaServer Faces (JSF) para desenvolvimento de interfaces web. Ele descreve o funcionamento entre cliente e servidor, apresenta os tópicos cobertos como JSF, vantagens e desvantagens, e demonstra como configurar o ambiente de desenvolvimento e criar um formulário simples com JSF.
Venha conhecer as principais tecnologias disponibilizadas para o desenvolvimento de aplicações Web utilizando a plataforma Java Enterprise.
Neste mini-curso serão demonstrados conceitos e exemplos das bibliotecas para o desenvolvimento Java EE, como: JSF, JPA, CDI EJB, JAX-RS, dentre outras.
5 técnicas para acelerar o desenvolvimento e reduzir Bugs em aplicações WEBRafael Chinelato Del Nero
O documento discute técnicas para acelerar o desenvolvimento e reduzir bugs em aplicações web Java, incluindo: 1) manipulação efetiva das fases do JSF; 2) uso efetivo de Ajax; 3) uso efetivo de escopos do JSF; 4) reuso de componentes prontos; e 5) uso do Facelets. Ele também discute as vantagens e desvantagens do JSF e exemplos de implementações e extensões populares.
Este documento apresenta uma introdução aos principais frameworks Java EE para desenvolvimento de aplicações web: Java Server Faces (JSF), Java Persistence API (JPA) e Context Dependency Injection (CDI). A apresentação inclui uma explicação dos conceitos e funcionalidades de cada framework, como JSF permite a criação de interfaces gráficas web, JPA mapeia objetos Java para bancos de dados e CDI gerencia o ciclo de vida de componentes e injeção de dependências. A apresentação termina com uma demonstração prática do uso conjunto destes frameworks.
Java CDI: Usando Java CDI em projetos Jakarta EE ou MicroprofileVictor Osorio
O documento apresenta uma introdução ao Java CDI, incluindo o que é, como criar projetos CDI e casos de uso como declarar, usar, interceptar chamadas, decorators e eventos. O documento também discute como usar CDI em projetos Jakarta EE e Microprofile.io e como implementar CDI em projetos Java SE.
O documento apresenta o framework Java Business Controller (JBC), que tem como objetivo otimizar o tempo de desenvolvimento de códigos repetitivos relacionados ao controle de transações e persistência em banco de dados. O JBC fornece recursos como controle de transações, consultas HQL e busca paginada de forma a abstrair esses processos e permitir que os desenvolvedores foquem na lógica de negócio. O documento também explica como implementar e usar o JBC em projetos Java.
Este documento fornece informações sobre uma palestra gratuita sobre Java EE 6. Ele inclui o objetivo da palestra, a agenda, informações sobre o palestrante e uma seção de doações para uma instituição de caridade local.
Este documento resume as principais tecnologias para desenvolvimento de sistemas web em Java, incluindo Facelets, Java Server Faces (JSF), Hibernate e RichFaces. O documento discute o funcionamento e configuração dessas tecnologias e fornece exemplos de código.
A apresentação visa repensar os padrões JavaEE para evitar o uso de padrões obsoletos, focando no container server-side, para criar arquiteturas enxutas.
Semelhante a Curso de Enterprise JavaBeans (EJB) (JavaEE 7) (20)
Como criar um mapa temático interativo com dados abertos e D3.jsHelder da Rocha
Apresentação realizada na trilha JavaScript The Developer's Conference (TDC) Recife 2019. Código e demonstrações disponíveis no GitHub e CodePen (veja links no final).
TDC 2019: transformando dados públicos em mapas interativosHelder da Rocha
Este documento apresenta um tutorial prático sobre como usar a biblioteca D3.js para criar mapas temáticos interativos utilizando dados abertos. O tutorial ensina como obter dados geoespaciais e temáticos de portais públicos, gerar objetos SVG com D3, aplicar projeções e recursos interativos. O código-fonte completo e demonstrações online estão disponíveis no GitHub para aprendizado e referência.
Padrões essenciais de mensageria para integração de sistemasHelder da Rocha
O documento apresenta padrões essenciais de mensageria para integração de sistemas, descrevendo: (1) 4 estratégias básicas de integração, incluindo o uso de mensageria; (2) o que é um sistema de mensageria e seus componentes; (3) 10 padrões de mensageria focados em minimizar acoplamento entre componentes.
O documento discute a visualização de dados na web, mencionando gráficos que revelam informações, interagem com dados e omitem ou enganam. Apresenta exemplos históricos de gráficos e ferramentas atuais para criação de gráficos dinâmicos e interativos. Discorre sobre como gráficos podem transmitir confiança excessiva, omitir dados e usar escalas de forma enganosa.
O documento apresenta uma introdução à visualização de dados, abordando: 1) a teoria e tipos de gráficos; 2) qualidade e aplicações de visualizações; 3) demonstrações práticas usando D3.js e Leaflet. O objetivo é comunicar e revelar informações quantitativas de forma eficiente por meio de representações visuais.
Este documento fornece uma introdução à Java Persistence API (JPA), abordando tópicos como: 1) relacionamentos entre objetos; 2) mapeamento objeto-relacional; 3) introdução prática com um exemplo "Hello World" utilizando JPA.
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Helder da Rocha
Este documento fornece um tutorial sobre o desenvolvimento de serviços web RESTful usando a especificação JAX-RS no Java EE 7. Explica conceitos como recursos, métodos HTTP, templates de caminho e anotações para mapear recursos e métodos. Também fornece exemplos simples de implementação de recursos RESTful com JAX-RS.
1. O documento discute os conceitos e mecanismos de segurança padrão no Java EE, incluindo autenticação, autorização e comunicação segura.
2. São descritos os principais componentes de segurança como realms, principals, roles e as APIs de autenticação como BASIC, DIGEST e FORM.
3. São explicados os processos de autenticação na camada web e em componentes EJB, assim como o uso de SSL/TLS para comunicação segura.
1. O documento apresenta os fundamentos de programação concorrente em Java, incluindo threads, a interface Runnable, como iniciar novos threads, interrupção de threads, espera de threads e problemas de corrida.
2. A segunda parte aborda a API de concorrência do Java, incluindo classes e interfaces do pacote java.util.concurrent.
3. O documento fornece exemplos de código para ilustrar os principais conceitos de programação concorrente em Java.
O documento discute as principais novidades do Java 8, incluindo: 1) novas expressões lambda e referências para métodos, 2) APIs de data e hora, streams e interfaces funcionais, e 3) a ferramenta Nashorn para JavaScript. Apresenta exemplos de código para ilustrar essas mudanças na sintaxe e APIs.
Sincronizadores são objetos que controlam o fluxo de threads em Java. O documento descreve implementações como Semaphore, CountDownLatch, CyclicBarrier, Exchanger e Phaser, que fornecem padrões de sincronização. A infraestrutura comum é fornecida pela classe AbstractQueuedSynchronizer.
1. O documento discute tópicos sobre concorrência e paralelismo em Java, incluindo criação e controle de threads, acesso exclusivo, ciclo de vida de aplicações, variáveis atômicas e travas.
2. É introduzido o framework Fork/Join, que permite paralelizar tarefas recursivas usando a estratégia "dividir para conquistar" em CPUs multi-core.
3. São explicados conceitos como work stealing, onde threads roubam tarefas de outras filas para executar, melhorando a performance.
O documento discute frameworks e implementações para execução concorrente de tarefas em Java, incluindo Executors, ExecutorService, ThreadPoolExecutor, CompletionService e CompletableFuture. Ele explica como submeter tarefas para execução, obter resultados e controlar a finalização de threads.
O documento discute o uso de coleções em ambientes concorrentes em Java, abordando: 1) Coleções imutáveis que podem ser usadas sem travas; 2) Coleções sincronizadas que fornecem acesso thread-safe; 3) Algoritmos concorrentes do pacote java.util.concurrent que reduzem o uso de travamento.
1. O documento discute diferentes tipos de travas (locks) em Java, incluindo ReentrantLock, ReadWriteLock, Condition e StampedLock.
2. ReentrantLock fornece funcionalidades além de synchronized como interrupção e timeouts. Condition representa condições associadas a uma trava.
3. ReadWriteLock contém travas de leitura e gravação que permitem leituras concorrentes mas bloqueiam gravações. StampedLock oferece uma alternativa mais eficiente em casos com muitas leituras.
1. O documento discute utilitários de concorrência em Java, incluindo variáveis atômicas, unidades de tempo e coleções concorrentes.
2. Variáveis atômicas permitem operações atômicas em tipos primitivos e referências através de métodos como getAndSet e compareAndSet.
3. Updaters permitem encapsular atributos em objetos para operações atômicas como incremento e substituição de valores.
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...Faga1939
Este artigo tem por objetivo apresentar como ocorreu a evolução do consumo e da produção de energia desde a pré-história até os tempos atuais, bem como propor o futuro da energia requerido para o mundo. Da pré-história até o século XVIII predominou o uso de fontes renováveis de energia como a madeira, o vento e a energia hidráulica. Do século XVIII até a era contemporânea, os combustíveis fósseis predominaram com o carvão e o petróleo, mas seu uso chegará ao fim provavelmente a partir do século XXI para evitar a mudança climática catastrófica global resultante de sua utilização ao emitir gases do efeito estufa responsáveis pelo aquecimento global. Com o fim da era dos combustíveis fósseis virá a era das fontes renováveis de energia quando prevalecerá a utilização da energia hidrelétrica, energia solar, energia eólica, energia das marés, energia das ondas, energia geotérmica, energia da biomassa e energia do hidrogênio. Não existem dúvidas de que as atividades humanas sobre a Terra provocam alterações no meio ambiente em que vivemos. Muitos destes impactos ambientais são provenientes da geração, manuseio e uso da energia com o uso de combustíveis fósseis. A principal razão para a existência desses impactos ambientais reside no fato de que o consumo mundial de energia primária proveniente de fontes não renováveis (petróleo, carvão, gás natural e nuclear) corresponde a aproximadamente 88% do total, cabendo apenas 12% às fontes renováveis. Independentemente das várias soluções que venham a ser adotadas para eliminar ou mitigar as causas do efeito estufa, a mais importante ação é, sem dúvidas, a adoção de medidas que contribuam para a eliminação ou redução do consumo de combustíveis fósseis na produção de energia, bem como para seu uso mais eficiente nos transportes, na indústria, na agropecuária e nas cidades (residências e comércio), haja vista que o uso e a produção de energia são responsáveis por 57% dos gases de estufa emitidos pela atividade humana. Neste sentido, é imprescindível a implantação de um sistema de energia sustentável no mundo. Em um sistema de energia sustentável, a matriz energética mundial só deveria contar com fontes de energia limpa e renováveis (hidroelétrica, solar, eólica, hidrogênio, geotérmica, das marés, das ondas e biomassa), não devendo contar, portanto, com o uso dos combustíveis fósseis (petróleo, carvão e gás natural).
Este certificado confirma que Gabriel de Mattos Faustino concluiu com sucesso um curso de 42 horas de Gestão Estratégica de TI - ITIL na Escola Virtual entre 19 de fevereiro de 2014 a 20 de fevereiro de 2014.
As classes de modelagem podem ser comparadas a moldes ou
formas que definem as características e os comportamentos dos
objetos criados a partir delas. Vale traçar um paralelo com o projeto de
um automóvel. Os engenheiros definem as medidas, a quantidade de
portas, a potência do motor, a localização do estepe, dentre outras
descrições necessárias para a fabricação de um veículo
Em um mundo cada vez mais digital, a segurança da informação tornou-se essencial para proteger dados pessoais e empresariais contra ameaças cibernéticas. Nesta apresentação, abordaremos os principais conceitos e práticas de segurança digital, incluindo o reconhecimento de ameaças comuns, como malware e phishing, e a implementação de medidas de proteção e mitigação para vazamento de senhas.
2. JAVAEE7 Sobre este tutorial
Este é um tutorial sobre tecnologia EJB (de acordo com a especificação Java
EE 7) criado para cursos presenciais e práticos de programação por Helder
da Rocha
Este material poderá ser usado de acordo com os termos da licença
Creative Commons BY-SA (Attribution-ShareAlike) descrita em http://
creativecommons.org/licenses/by-sa/3.0/br/legalcode.
O código dos exemplos está disponível em repositório público no GitHub e
é software livre sob os termos da licença Apache 2.0.
3. JAVAEE7 Conteúdo
1. Introdução
2. Session Beans
3.Acesso local e remoto
4. Message-Driven Beans
5. Concorrência
6.Transações
7. Segurança
5. JAVAEE7 Enterprise JavaBeans
•Enterprise JavaBeans são componentes que encapsulam a lógica de
negócios de uma aplicação.
•Implementam serviços síncronos e assíncronos, podem exportar uma
interface para clientes locais, mas também para clientes remotos usando
protocolos de objetos remotos (RMI/IIOP) ou Web Services (SOAP)
•Instâncias de EJBs têm o ciclo de vida controlado em tempo de execução
pelo container no qual ele está instalado, que também disponibiliza o
acesso a serviços configuráveis de segurança, transações, agendamento,
concorrência, sincronização, distribuição e outros de forma transparente
6. JAVAEE7 Enterprise JavaBeans
•Enterprise JavaBeans são JavaBeans, ou POJOs: objeto Java com
construtor default, atributos encapsulados acessíveis via getters/setters
•Existem dois tipos de EJBs:
•Session beans
•Message-driven beans
•Em aplicações Java EE, EJBs são parte da camada de negócios e
geralmente acessados por clientes locais ou remotos de uma mesma
aplicação distribuída.
•EJBs podem ser fachadas de serviços para a camada de dados
7. JAVAEE7 Tipos de enteprise beans
•Session Beans
• Modelam processos de negócio. São ações, verbos.
• Fazem coisas: acessam um banco, fazem contas,
• Podem manter ou não estado não-persistente
• Processar informação, comprar produto, validar cartão
•Message-driven beans
• Modelam processos assíncronos. Respondem a eventos.
• Agem somente quando recebem uma mensagem
• Não mantêm estado
8. JAVAEE7 Persistent entities
•Persistent entities
• Não são Enterprise JavaBeans
• Modelam dados de negócio. São coisas, substantivos.
• Um produto, um empregado, um pedido
• Mantêm estado persistente
• São mapeados a tabelas usando ORM (JPA em Java EE)
• Geralmente inacessíveis a clientes externos: o acesso ocorre através de
fachadas de serviços síncronos (Session Beans) e assíncronos (filas JMS
e Message-Driven Beans)
9. JAVAEE7 Uso típico de componentes Java EE
Entity (JPA)
Session BeanMessage-driven Bean
Entity (JPA)
Session Bean
Servlet
Managed
BeanCliente
Java
Cliente JMS
JSF/JSP
MOM
BD
Cliente
HTML/JS
Cliente
WebService
Entity (JPA) Entity (JPA)
EJB Container
Web Container
11. JAVAEE7 Session Beans
•Componentes que exportam uma interface de serviços
•Interface local (acessível dentro da mesma aplicação WAR/EJB/EAR)
•Interface remota (acessível de outras aplicações ou JVMs) através de
protocolo RMI/IIOP ou SOAP
•Beans têm o ciclo de vida controlado pelo container (que cria e destrói
os beans) e são acessíveis a clientes apenas via proxies que são
injetados nos clientes pelo container ou localizados via registros JNDI
•Modelam uma sessão (diálogo) de comunicação com um cliente
através da chamada de seus métodos
12. JAVAEE7 Tipos de Session Beans
•Stateful Session Beans
•Modelam diálogos com um ou mais requisições que podem depender de
requisições anteriores. Preservam estado do cliente entre chamadas.
•Stateless Session Beans
•Modelam diálogos com apenas uma requisição ou várias requisições
independentes. Não preservam estado do cliente entre chamadas.
•Singleton Session Beans
•Modelam diálogos entre vários clientes e a aplicação. São criados uma vez
por aplicação. Compartilham estado da aplicação entre clientes.
13. JAVAEE7 Interfaces para Session Beans
•Um bean é acessível apenas através de sua interface. Há 4 tipos:
•No-Interface View: acessível localmente a clientes da mesma aplicação.A
interface de serviços inclui todos os seus métodos (inclusive herdados).
•Interface local usando @Local: bean implementa uma ou mais interfaces
com métodos que são acessíveis por clientes na mesma aplicação e JVM.
•Interface remota (para clientes IIOP) usando @Remote: bean implementa
uma ou mais interfaces com métodos acessíveis por clientes locais ou de
outras aplicações, servidores ou JVMs.
•Interface remota (para clientes SOAP) usando @WebService: bean
implementa interface que declara métodos acessíveis via WSDL/SOAP ou
declara no bean (com @WebMethod) cada método da interface WSDL/SOAP
14. JAVAEE7 Stateless Session Beans (SLSB)
•A anotação @Stateless cria um Stateless Session Bean com uma no-
interface view (interface local contendo todos os métodos do bean)
@Stateless
public class VitrineVirtual {
public List<Produto> listarTodos() { ... }
public CestaDeCompras getCesta() { ... }
}
•Um componente que tiver o bean injetado pode chamar seus métodos.
@EJB VitrineVirtual vitrine;
...
public void metodo() {
for(Produto p : vitrine.listarTodos())
...
}
15. JAVAEE7 Stateful Session Beans (SFSB)
•A anotação @Stateful cria um Stateful Session Bean com uma no-
interface view:
@Stateful
public class CestaDeCompras {
public void adicionar(Produto p) { ... }
public void remover(Produto p) { ... }
}
•Ele pode ser injetado em um cliente da mesma forma que o SLSB:
@EJB CestaDeCompras cesta;
...
public void metodo(Produto produto, int quantidade) {
for(int i = 0; i < quantidade; i++)
cesta.adicionar(produto);
System.out.println(cesta.toString()); // herdado
}
16. JAVAEE7 Pool de Session Beans
•Session Beans podem ser guardados em um pool, onde são pré-instanciados
pelo container, e reutilizados por diferentes clientes
•Em um pool de Stateless Session Beans todas as instâncias da mesma classe
são equivalentes e indistinguíveis.
•Qualquer instância pode servir a qualquer cliente
•Como Stateful Session Beans mantém estado para cada cliente, o container
não pode fazer o mesmo tipo de pooling já que beans não são equivalentes.
•Se um pool tem mais clientes que beans, o container otimiza o uso de recursos
através de um mecanismo de ativação e passivação
17. JAVAEE7 Passivação e ativação
•Um pool de Stateful Session Beans mantém várias instâncias ativas
•Passivação: se chegar um novo cliente e não houver mais beans no pool,
o bean que foi acessado há mais tempo terá o estado da sua sessão
gravado em meio persistente, e a instância irá para o cliente novo.
•Ativação: se esse cliente continua um diálogo iniciado anteriormente
e que foi passivado, o estado da sessão é obtido do meio persistente e
restaurado na instância.
•Antes da passivação, o container chama qualquer método anotado com
@PrePassivate. Logo após a ativação, ele chama @PostActivate. Esses
métodos podem ser usados para lidar com estados não serializáveis
18. JAVAEE7 Ciclo de vida: Stateless Session Bean
Bean não
existe
Pool de beans
equivalentes
1. Objeto criado
2. @PostConstruct @PreDestroy
metodo()
Qualquer cliente pode chamar
um método de negócio em
qualquer EJBObject
Container cria um novo bean
quando ele acha que precisa
de mais beans no pool para
servir à demanda dos clientes
Quando o container decidir
que não precisa mais de tantas
instâncias, chama método
marcado com @PreDestroy e
remove a instância
19. JAVAEE7 Ciclo de vida: Stateful Session Bean
Bean não
existe
Inativo
1. Objeto criado
2. @PostConstruct
@PreDestroy
metodo()
Cliente chama método de
negócio no EJBObject
Cliente cria bean
Cliente chamou método em um bean inativo.
Container precisa ativar o bean novamente
Limite de beans
ativos foi atingidoCliente chama
método @Remove
Ativo
@PrePassivate
@PostActivate
Sessão
expirada
@Remove
chamado
20. JAVAEE7 Encerramento da sessão (diálogo)
•Em um Stateless Bean ela inicia com a chamada de um método e
termina quando esse método termina
•Em um Stateful Bean ela tem tempo indeterminado, já que o
estado do cliente é mantido por varias chamadas
•Se o cliente decidir que diálogo terminou, poderá remover o bean. Para
isto é necessário anotar um método do bean com @Remove
@Remove public void remover() {}
•O método pode ser vazio. O bean é removido quando o método termina
21. JAVAEE7 Singleton Session Beans
•A anotação @Singleton declara um Singleton Session Bean com uma no-
interface view:
@Singleton
public class ServicosGlobais { ... }
•É um tipo especial de Stateless Session Bean que não mantém estado por
cliente (é stateless) mas pode ter estado compartilhado por toda a aplicação
•É instanciado uma única vez por aplicação (mas se uma aplicação for
distribuída por várias JVMs, haverá uma instância em cada)
•Singletons tem o escopo da aplicação. Seu estado é compartilhado mas
seus métodos são thread-safe por default (acesso exclusivo)
22. JAVAEE7 Startup Singleton Beans
•É comum instruir o container a carregar o bean durante a inicialização da
aplicação anotando-o com @Startup:
@Startup @Singleton
public class ServicosGlobais { ... }
•Às vezes um singleton depende da inicialização prévia de outros
singletons. Isto pode ser configurado usando @DependsOn:
@Singleton @DependsOn("ServicosGlobais")
public class EstatisticasDeAcesso { ... }
•Pode-se fornecer uma lista de beans a inicializar previamente
@Singleton @DependsOn({"Configuracao", "Inicializacao"})
public class Aplicacao { ... }
23. JAVAEE7 Ciclo de vida: Singleton Session Bean
Bean não
existe
Bean
disponível
1. @Startup (objeto criado)
2. @EJB, @inject
3. @PostConstruct
@PreDestroy
metodo()
Cliente pode
chamar método
Se marcado com @Startup
container cria único bean que
terá seu estado compartilhado
entre clientes
Quando a aplicação for
finalizada chama método
marcado com @PreDestroy e
remove a instância
24. JAVAEE7 Callbacks do ciclo de vida
•Há quatro anotações EJB para métodos de callback, chamados
automaticamente em eventos do ciclo de vida:
•@PostConstruct (todos os beans: SB, MDB)
•@PreDestroy (todos os beans: SB, MDB)
•@PrePassivate (apenas Stateful Session Beans)
•@PostActivate (apenas Stateful Session Beans)
•Outras anotações para métodos que influenciam o ciclo de vida
(somente Session Beans)
•@Remove (em Stateful Session Beans: permite remoção pelo cliente)
•@AroundConstruct usada em interceptadores
25. JAVAEE7 @PostConstruct
•Usada para anotar um método que deve ser chamado
•depois da execução do construtor default e injeção de dependências
•antes de qualquer método da interface pública do bean
@Stateless
public class Biblioteca {
@Inject ServicoIsbn servico;
@PostConstruct
private void inicializar() {
servico.login();
}
...
}
26. JAVAEE7 @PreDestroy
•Anota método que deve ser chamado antes do bean ser removido
•O bean pode ser removido explicitamente pelo cliente (via método
anotado com @Remove em SFSB) ou pelo container (a qualquer
momento para SLSB), ou na finalização da aplicação (singletons).
@Stateless
public class Biblioteca {
...
@PreDestroy
private void finalizar() {
servico.logout();
}
...
}
27. JAVAEE7 @PrePassivate
•Usada apenas em stateful session beans e chamado antes que o
bean entre no estado passivo
@Stateful
public class CestaDeCompras implements Serializable {
private transient String codigoAcesso;
@Inject private Cliente cliente;
@PrePassivate
private void passivar(InvocationContext ctx) {
cliente.liberarCodigoAcesso();
}
...
}
28. JAVAEE7 @PostActivate
•Usada apenas em stateful session beans e chamado depois que o
bean é reativado do seu estado passivo
@Stateful
public class CestaDeCompras implements Serializable {
private transient String codigoAcesso;
@Inject private Cliente cliente;
@PostActivate
private void ativar(InvocationContext ctx) {
codigoAcesso = cliente.obterNovoCodigoAcesso();
}
...
}
29. JAVAEE7 Exercícios
•1. Crie um Stateless bean simples com os seguintes métodos:
•String caixaAlta(String texto) - que põe o texto recebido em caixa-alta
•List<Integer> contagem(int limite) - retorna sequência de números até o limite
•2. Crie um cliente Web na mesma aplicação (um servlet, um JSP, um managed bean
+ JSF) que chame esses métodos
•3. Crie um Stateful bean simples com os seguintes métodos:
•void incrementar() - adiciona um
•void decrementar() - remove um
•int resultado() - retorna o total
•4. Crie um cliente Web que injete três diferentes instâncias do bean, e chame vários
desses métodos imprimindo o resultado no final
•5.Transforme o bean do exercício 3 em um Singleton e execute o cliente novamente
31. JAVAEE7 Localização de recursos
•O instanciamento de recursos (conexões, beans e outros componentes) é
realizada automaticamente pelo container que gerencia seu ciclo de vida.
•Clientes precisam de proxies e interfaces para acessar os recursos
•Clientes locais declaram dependências que são injetadas
automaticamente pelo container (com DI ou CDI), e clientes remotos
localizam explicitamente dependências via JNDI
•Um nome JNDI pode ser especificado com escopo global ou no contexto
de uma aplicação (EAR), módulo (WAR,JAR) ou componente (Bean)
•DI é acionado através de anotações @EJB e @Resource. CDI utiliza a
anotação @Inject
32. JAVAEE7 JNDI Global
•Um nome JNDI global tem a forma mínima:
java:global/aplicacao/bean
•Para beans armazenados em EJB JARs ou WARs.A aplicação é (por default) o
nome do arquivo sem a extensão (aplicacao.war ou aplicacao.jar)
•Se o WAR ou EJB JAR estiver dentro de um EAR, ele é um módulo da aplicação
EAR. Nesse caso, o EAR é incluído no caminho global:
java:global/aplicacao/modulo/bean
•O nome da aplicação é o nome do EAR (ex: aplicacao.ear) e os módulos podem
ser o nome do arquivo (default) ou declarados em /META-INF/application.xml.
•Se o bean tiver mais de uma interface e for necessário identificar uma delas, o
nome (qualificado) da interface pode ser incluído depois do bean:
java:global/aplicacao/modulo/bean!pacote.Interface
33. JAVAEE7 JNDI local a um contexto
•JNDI relativo pode ter seu escopo limitado no escopo do componente, módulo /
aplicação ou container
•Se o acesso JNDI ocorrer entre módulos da mesma aplicação (EAR), pode-se
usar o acesso no escopo do container com prefixo java:app:
java:app/modulo/bean
•Se a comunicação ocorrer no contexto do módulo, ou se a aplicação não estiver
em um EAR, pode-se usar qualquer uma das duas formas:
java:app/bean
java:module/bean
•Pode-se também usar JNDI para acessar propriedades de um componente
(declaradas em web.xml ou anotações) usando java:comp/propriedade
34. JAVAEE7 JNDI: exemplos
•Um bean @Remote LivroBean empacotado em biblioteca.war pode ser chamado
localmente (ex: por um managed bean ou servlet no mesmo WAR) usando:
•E por um cliente remoto usando:
public class LivroClientServlet extends HttpServlet {
public void init() {
try {
Context ctx = new InitialContext(); // inicialização do JNDI
LivroBean bean = (LivroBean)ctx.lookup("java:app/LivroBean");
bean.inicializar();
...
public class LivroRemoteTest extends TestCase {
@Test
public void testLookup() {
Context ctx = new InitialContext();
LivroBean bean =
(LivroBean)ctx.lookup("java:global/biblioteca/LivroBean");
...
35. JAVAEE7 No-Interface View
•Consiste no uso local de um bean sem declarar interfaces especiais
•A classe do bean pode ser referenciada via injeção de dependências
@EJB
BibliotecaBean bean; // classe do bean
•Também é possível referenciar o bean via JNDI
Context jndi = new InicialContext();
BibliotecaBean bean = (BibliotecaBean)
jndi.lookup("java:app/BibliotecaBean");
•Os métodos podem ser chamados como se ele fosse uma referência Java
comum (métodos herdados também fazem parte da interface)
36. JAVAEE7 Interface Local
•Uma interface @Local declara apenas métodos acessíveis a clientes locais:
@Local
interface Biblioteca {
void emprestar(Livro livro);
void devolver(Livro livro);
}
•O bean só precisa implementar a interface:
@Stateless
class BibliotecaBean implements Biblioteca { ... }
•Se a interface não puder ser anotada com @Local, é possível usá-la se
implementada no bean e passada como parâmetro de @Local:
@Local(Biblioteca.class)
class BibliotecaBean implements Biblioteca {}
37. JAVAEE7 Usando uma interface @Local
•Os clientes de uma interface @Local devem pertencer à mesma aplicação
e podem usar injeção de dependências com @EJB para referenciar a
interface (não o bean):
@SessionScoped
public class Administrador {
@EJB Biblioteca biblioteca; // interface @Local
public void recebidos(List<Livro>) {
for(Livro m : livros) {
biblioteca.devolver(m);
}
}
...
}
38. JAVAEE7 Usando uma interface @Local
•Pode-se também obter acesso ao bean através de lookup JNDI
(também referenciando a interface):
@SessionScoped
public class Administrador {
Biblioteca biblioteca;
@PostConstruct
public void init() {
Context ctx = new InicialContext();
biblioteca = (Biblioteca)
ctx.lookup("java:app/Biblioteca");
}
...
}
39. JAVAEE7 Acesso local a beans: resumo
•Beans com no-interface view: @EJB referencia a classe do bean
@EJB
ExampleBean exampleBean;
• Acesso via JNDI
ExampleBean exampleBean = (ExampleBean)
initialContext.lookup("java:module/ExampleBean");
•Beans que implementam interface @Local: @EJB referencia a interface
@EJB
ExampleLocal example;
• Acesso via JNDI
ExampleLocal example = (ExampleLocal)
initialContext.lookup("java:module/ExampleLocal");
40. JAVAEE7 Interface Remota
•Interfaces @Remote têm métodos acessíveis por clientes de outras
aplicações ou JVMs
@Remote
interface BibliotecaRemote {
void consultar(Livro livro);
void reservar(Livro livro);
}
@Stateless
class BibliotecaBean implements BibliotecaRemote { ... }
•Se a interface não puder ser anotada com @Remote, o bean ainda pode
declará-la como parâmetro de @Remote:
@Remote(BibliotecaRemote.class)
class BibliotecaBean implements BibliotecaRemote, Intf2 {}
41. JAVAEE7 Usando uma interface remota
•Dentro do mesmo servidor pode-se obter a referência para um bean
remoto via injeção de dependências (referenciando pela interface):
@EJB BibliotecaRemote biblioteca;
•Para acessar beans de containers localizados em JVMs diferentes, é
necessário obter um proxy via JNDI:
Context ctx = new InicialContext();
BibliotecaRemote biblioteca = (BibliotecaRemote)
ctx.lookup("java:global/libraryapp/Biblioteca");
42. JAVAEE7 Clientes remotos RMI/IIOP
•Clientes RMI/IIOP que não estão em container Java EE podem obter um
proxy para um EJB via JNDI global (proprietário) do servidor
•Em alguns servidores (ex: WebSphere 7) o proxy é um objeto CORBA que
precisa ser convertido com PortableRemoteObject.narrow():
java.lang.Object stub = ctx.lookup("java:app/BibliotecaRemote ");
BibliotecaRemote biblioteca = (BibliotecaRemote)
javax.rmi.PortableRemoteObject.narrow(stub,
BibliotecaRemote.class);
•Chamadas remotas tem natureza diferente de chamadas locais
•Parâmetros e tipos de retorno são passados por valor (são proxies de rede)
•Não é possível fazer operações que alteram propriedades de um bean remoto por
referência (é necessário alterar o bean localmente e depois sincronizar)
43. JAVAEE7 Web Services SOAP (JAX-WS)
•Session Beans podem exportar interface como Web Service SOAP
• Declara @WebService(endpointInterface="nome da interface”)
ou implementa a interface
•Com deploy, servidor gera classes,WSDL, e estabelece endpoint
• URI?wsdl retorna WSDL que pode ser usado para gerar clientes
•@WebMethod, @WebParam, @WebContext e outras anotações
configuram serviço e alteram defaults
44. JAVAEE7 Interface e implementação
@Stateless @WebService
public class WSBean implements WSBeanInterface {
@Override
public int[] numerosDaSorte() {
int[] numeros = new int[6];
for(int i = 0; i < numeros.length; i++) {
int numero = (int)Math.ceil(Math.random() * 60);
numeros[i] = numero;
}
return numeros;
}
}
@WebService
interface WSBeanInterface {
int[] numerosDaSorte();
}
45. JAVAEE7 Exemplo de cliente (GlassFish)
• Geração de stubs com JAX-WS
wscompile –s . http://servico/endpoint?wsdl
• Cliente
public class App {
public static void main( String[] args ) throws Exception {
WSBeanService service = new WSBeanService();
WSBeanInterface proxy = service.getWSBeanPort();
java.util.List<Integer> numeros = proxy.numerosDaSorte();
System.out.println("Numeros da sorte: ");
for(int numero: numeros) {
System.out.print(numero + " ");
}
System.out.println();
}
}
Classes geradas
46. JAVAEE7 Embedable EJB
•Permite conectar sem depender de configurações proprietárias e
obter um contexto JNDI global para localizar o bean
public void testEJB() throws NamingException {
EJBContainer ejbC =
EJBContainer.createEJBContainer(
ResourceManager.getInitialEnvironment(new Properties()));
Context ctx = ejbC.getContext();
MyBean bean = (MyBean)
ctx.lookup ("java:global/classes/org/sample/MyBean");
// fazer alguma coisa com o bean
ejbC.close();
}
47. JAVAEE7 Configuração de Embeddable EJB
•É preciso ter no classpath os JARs requeridos pelo container (pode
incluir JARs específicos do servidor usado)
•E necessário especificar as seguintes propriedades em um arquivo
jndi.properties localizado no classpath:
• javax.ejb.embeddable.initial
• javax.ejb.embeddable.appName
•O valor das propriedades é dependente do fabricante e do ambiente do
servidor. O fabricante também poderá requerer propriedades adicionais
48. JAVAEE7 Exercícios
•5. Declare a seguinte interface @Local
• String dataHoje() - retorne new Date()
• int[] numerosDaSorte(int quantidade) - use exemplo fornecido
•6. Crie um Stateless bean que implemente a interface do exercício
5 e um cliente Web que injete a interface e chame os métodos
•7.Altere o bean do exercício 1 para que ele implemente uma
interface @Remote e @WebService contendo seus dois métodos.
•8. Escreva um cliente SOAP (use ferramentas WSDL do servidor)
que rode em linha de comando e chame os métodos do bean
através da interface desenvolvida no exercício anterior.
50. JAVAEE7 Message-Driven Beans (MDB)
•Message-driven beans (MDB) são processadores assíncronos
•Clientes não acessam MDBs diretamente (MDBs não possuem
interfaces) mas interagem através do envio de mensagens para
um canal de mensageria (geralmente um destino JMS)
•MDBs atuam como listeners de mensageria registrados para
consumir mensagens enviadas a um determinado canal
•Um MDB pode chamar outros beans, iniciar contextos
transacionais, injetar e usar serviços disponíveis à aplicação
51. JAVAEE7 Message Driven Beans (MDB) com JMS
•Um MDB implementado com JMS é uma implementação de
MessageListener anotada com @MessageDriven
•As mensagens que chegam no canal são recebidas por onMessage()
•MessageDrivenContext contém uma API com métodos para
controle transacional e segurança
@MessageDriven( ... )
public class ProdutoMDB implements MessageListener {
@Resource private MessageDrivenContext mdc;
@EJB private ProdutoFacade fachada;
public void onMessage(Message message) {
// processa mensagem recebida
}
}
52. JAVAEE7 O método onMessage()
•Quando uma mensagem é recebida por um canal de mensageria,
o container chama o método onMessage() dos MDBs registrados
public void onMessage(Message inMessage) {
try {
if (inMessage instanceof TextMessage) {
String msg = (TextMessage) inMessage;
fachada.processarPedido(msg);
logger.info("Recebida: " + msg.getText());
} else {...}
} catch (JMSException e) {
e.printStackTrace();
mdc.setRollbackOnly();
} catch (Throwable te) {...}
}
53. JAVAEE7 Ciclo de vida: Message-Driven Bean
Bean não
existe
Bean
disponível
1. Criação
2. @EJB, @inject
3. @PostConstruct
@PreDestroy
onMessage()
Método chamado pelo
container quando mensagem
é recebida no destino JMS
Bean é inicializado
como MessageListener
de um destino JMS
Quando o container decidir,
chama método marcado com
@PreDestroy e remove a
instância
54. JAVAEE7 Mapeamento de um MDB a um canal
•O atributo mappedName é uma forma portável de informar o nome do
canal, mas de acordo com a especificação é de implementação opcional.
•Funciona no Glassfish mas em outros servidores onde pode ser necessário
usar propriedades de ativação (sintaxe varia entre fabricantes).
@MessageDriven(mappedName="pagamentos")
public class ProcessadorCartaoDeCredito implements MessageListener {
@Override
public void onMessage(Message message) {
try {
// processa a mensagem
} catch (JMSException ex) { ... }
}
}
55. JAVAEE7 Mapeamento de um MDB a um canal
•A propriedade activationConfig de @MessageListener recebe uma lista
propriedades de configuração em anotações @ActivationConfigProperty.
No WildFly/JBoss e WebSphere é obrigatório usar a propriedade
destination, que informa a fila ao qual o bean deve ser registrado:
@MessageDriven(
activationConfig={
@ActivationConfigProperty(propertyName="destination",
propertyValue="pagamentos")}
)
public class ProcessadorCartaoDeCredito implements MessageListener {
@Override
public void onMessage(Message message) {
try {
// processa a mensagem
} catch (JMSException ex) { ... }
}
}
56. JAVAEE7 Filtro de mensagens
•A propriedade messageSelector filtra mensagens que serão recebidas
•O filtro atua sobre cabeçalhos e propriedades da mensagem, que incluem
dados como data de validade, id e dados incluídos pelo remetente
•Um cliente JMS pode gravar uma propriedade em uma mensagem JMS com:
mensagem.setIntProperty("quantidade", 10);
•O MDB pode ser configurado para não receber mensagens que não tenha essa
propriedade ou filtrar por valor:
@MessageDriven(
activationConfig={ ...,
@ActivationConfigProperty(
propertyName="messageSelector",
propertyValue="quantidade is not null and quantidade >= 10")}
)
public class ProcessadorCartaoDeCredito implements MessageListener {…}
57. JAVAEE7 Produtor JMS
•Produtores são clientes que enviam mensagens a um destino
•Qualquer componente Java EE ou aplicação standalone que tenha acesso
a conexões e canais usados pelo MDB
•Se estiver dentro do container, pode injetar a conexão ou o contexto
JMS 2.0 (via CDI), e o destino (canal) para onde enviará mensagens
@Resource(mappedName="ConnectionFactory")
private static ConnectionFactory connectionFactory;
@Inject @JMSConnectionFactory("jms/ConnectionFactory")
private static JMSContext context;
@Resource(mappedName="jms/Queue")
private static Destination queue;
58. JAVAEE7 Um produtor JMS 2.0
@Stateless
public class ClienteEJB {
@Resource(mappedName="topic/testTopic”)
Topic topic;
@Resource(mappedName="java:/JmsXA”)
ConnectionFactory connectionFactory;
public void metodo() throws Exception {
JMSContext context =
connectionFactory.createContext();
context.createProducer().send(queue, "Texto");
}
}
59. JAVAEE7 Um produtor JMS 2.0 (usando CDI)
@Stateless
public class ClienteEJB {
@Resource(mappedName="queue/testQueue”)
Destination queue;
@Inject
@JMSConnectionFactory("jms/ConnectionFactory")
JMSContext ctx;
public void metodo() throws Exception {
ctx.createProducer().send(queue, "Texto");
}
}
60. JAVAEE7 Produtor JMS externo
•Clientes externos podem obter proxies através de registros JNDI
globais (configuração e acesso dependentes de plataforma):
Context ctx = new InitialContext();
ConnectionFactory factory = (ConnectionFactory)
ctx.lookup("global/ConnectionFactory");
Destination queue = (Destination)
ctx.lookup("global/jms/queue/test");
61. JAVAEE7 Cliente JMS externo* ao container
public class Client {
public static void main(String[] args) throws Exception {
Context jndi = new InitialContext();
ConnectionFactory factory = (ConnectionFactory)
jndi.lookup("ConnectionFactory");
Destination topic = (Destination)
jndi.lookup("topic/testTopic");
Connection connection =
factory.createConnection();
JMSContext context =
connectionFactory.createContext();
context.createProducer().send(queue, "Mensagem");
}
}
* Configuração e acesso ao JNDI depende da plataforma e pode ser mais complexo
62. JAVAEE7 Exercícios
•9. Utilizando os exemplos como base, escreva um produtor JMS (pode
ser um servlet) que envie mensagens para uma fila.As mensagens tem a
seguinte estrutura:
• "Codigo": X123 (StringProperty: gere uma sequência qualquer)
• "Quantidade": 5 (IntProperty: varie entre 1 e 30)
• Descrição do produto (Corpo da mensagem texto)
• Use uma fila default. Ex: queue/A (WildFly)
•10. Escreva um consumidor JMS MessageDrivenBean para ler e
consumir as mensagens enviadas sincronamente, selecionando apenas as
mensagens com menos de 10 produtos. Imprima os resultados no log ou
na saída.Teste a aplicação rodando o cliente e observando a saída.
64. JAVAEE7 Conncorrência em EJB
•A especificação desaconselha em EJBs o uso explícito de threads, locks,
sockets ou streams de I/O
•Threads podem interferir no ciclo de vida dos componentes
•Locks podem interferir no controle de transações e causar deadlocks
•Mas operações concorrentes, como notificações, agendamento e callbacks
podem ser realizadas em EJB usando MDB, timers, métodos assíncronos e
até mesmo executores que retornam objetos Future.
•A exclusão mútua de dados compartilhados é default em singletons, mas é
possível configurar locks que permitem leituras simultâneas
65. JAVAEE7 Concorrência controlada no container
•É opcional declarar explicitamente o controle de concorrência default:
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
•O comportamento default garante que todo método de um Singleton é
thread-safe, mas pode introduzir um gargalo desnecessário
•Métodos que não mudam estado devem ser anotados @Lock(LockType.READ),
que permite acesso simultâneo
•Métodos sem anotações @Lock ou anotados com LockType.WRITE, admitem
apenas um cliente de cada vez, bloqueando os que esperam
•A espera pode ser configurada com
@AccessTimeout (na classe ou método).
Acabando o tempo, o container lança
ConcurrentAccessTimeoutException:
@Singleton
@AccessTimeout(value=60000)
public class SingletonBean {
...
}
66. JAVAEE7 Controle de concorrência
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class ReadWriteSingleton {
private String estado;
@Lock(LockType.READ)
public String getEstado() {
return estado;
}
@Lock(LockType.WRITE)
@AccessTimeout(value=300000)
public void setEstado(String estado) {
this.estado = estado;
}
}
Múltiplos clientes podem acessar
este método ao mesmo tempo
Apenas um cliente pode acessar
este método ao mesmo tempo
(este é o comportamento default)
O cliente espera no
máximo 5 minutos (300
segundos) pelo acesso
Todos os métodos são synchronized por default
(para mudar default é preciso usar @Lock)
67. JAVAEE7 Controle de concorrência
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class ReadWriteSingleton {
private String estado;
@Lock(LockType.READ)
public String getEstado() {
return estado;
}
@Lock(LockType.WRITE)
@AccessTimeout(value=300000)
public void setEstado(String estado) {
this.estado = estado;
}
}
@Lock(LockType.WRITE)
é default
ConcurrencyManagementType
.CONTAINER é default
68. JAVAEE7 Concorrência controlada no bean
•É possível transferir a responsabilidade pelo controle da concorrência
para o bean com a declaração:
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
•Nesta configuração, os métodos do singleton não serão mais thread-
safe e precisam usar Java para configurar restrições de acesso
•Pode-se usar mecanismos do Java para programação concorrente:
blocos synchronized, variáveis volatile, sincronizadores e locks do
pacote java.util.concurrent.
69. JAVAEE7 Chamadas assíncronas
•Uma das maneiras de executar uma operação assíncrona usando session
beans é implementá-lo como cliente JMS (padrão Service Activator):
•O método cria uma mensagem, empacota os dados necessários para executar
a operação e envia a mensagem para uma fila JMS mapeada a um MDB.
•Recebida a mensagem, o MDB extrai os parâmetros e chama a operação.
•Outra forma (mais simples) de realizar operações assíncronas (desde Java
EE 6) é usar métodos anotados com @Asynchronous
•Método devolve um objeto Future<V> que permite a criação de callbacks
•Suportado em qualquer session bean
70. JAVAEE7 Métodos assíncronos
•Retornam Future<V> (implementado por javax.ejb.AsyncResult) ou void
•Um Future guarda o resultado que o cliente pode obter usando get(),
quando estiver disponível (quando isDone() retornar true)
•@Asynchronous também pode ser declarado na classe
@Stateless
public class Tradutor {
@Asynchronous
public Future<String> traduzir(String texto) {
StringBuilder textoTraduzido;
// ... realiza a tradução (demorada)
return new AsyncResult<String>(textoTraduzido.toString());
}
}
71. JAVAEE7
@SessionScoped @Named
public class ManagedBean {
@EJB
private Tradutor tradutor;
private Future<String> future;
public void solicitarTraducao(String texto) {
future = tradutor.traduzir(texto); // assíncrono
}
public String receberTraducao() {
while (!future.isDone()){
Thread.sleep(1000);
// fazer outras coisas
}
return (String)future.get();
}
}
Cliente de método assíncrono
•O exemplo abaixo ilustra um
cliente (CDI managed bean)
que usa um método assíncrono
72. JAVAEE7 Timers
•Serviços de agendamento configuráveis para session beans
•Apenas Stateless e Singleton
•Permitem que métodos sejam chamados periodicamente, ou uma única
vez em data e hora marcada, ou depois de um intervalo especificado
•Configurados anotando métodos com @Schedule (ou @Schedules para
múltiplos timers), que recebe parâmetros com regras de agendamento
•hour, minute, second, dayOfWeek, dayOfMonth, timezone, year, etc.
@Stateless
public class MyTimer {
@Schedule(hour="*", minute="*", second="*/10")
public void printTime() { ... }
...
}
73. JAVAEE7 Timers
•Exemplos de expressões:
•hour="7,19,23", dayOfWeek="1-5"
Executa 7, 19 e 23 h, segunda a sexta
•minute="30", hour="5"
Executa uma vez às 5 horas e 30 minutos
•hour="*", minute="*", second="*/10"
Toda hora e minuto a cada 10 s
•Também podem ser criados programaticamente usando métodos de
TimerService em beans que implementam a interface TimedObject
e seu método ejbTimeout(Timer)
•Neste caso o timer é configurado na inicialização do bean
74. JAVAEE7 Timers@Singleton @Startup
public class MyTimer implements TimedObject {
@Resource TimerService timerService;
@PostConstruct
public void initTimer() {
if (timerService.getTimers() != null) {
for (Timer timer : timerService.getTimers()) {
timer.cancel();
}
}
timerService.createCalendarTimer(
new ScheduleExpression().hour("*").minute("*").second("*/10"),
new TimerConfig("myTimer", true)
);
}
@Override
public void ejbTimeout(Timer timer) {
//código a executar quando o timer disparar
}
}
75. JAVAEE7 Timers
•Além de createCalendarTimer(), que faz agendamento periódico,
TimerService também permite criar timers que disparam uma única vez
com createSingleActionTimer()
•Se o bean não implementa a interface TimedObject, ele pode definir um
timeout usando um método anotado com @Timeout
•O método precisa retornar void, e não precisa receber parâmetros (se receber
deve ser um objeto Timer)
@Timeout
public void timeout(Timer timer) {
//codigo a executar quando timer disparar
}
76. JAVAEE7 Utilitários de concorrência
•Executores que permitem manipular threads dentro de aplicações
Java EE, disponíveis no pacote javax.enterprise.concurrent
•Similares a classes de java.util.concurrent (do qual derivam) mas são
gerenciadas pelo container e adequadas ao uso em EJBs e servlets
•As mais importantes são:
•ManagedExecutorService
•ManagedScheduledExecutorService
•ManagedThreadFactory
•ContextFactory
77. JAVAEE7 ManagedExecutorService
•Usando @Resource para injetar e usar um ManagedExecutorService
@Stateless
public class ConcurrentBean {
@Resource
ManagedExecutorService service;
@Asynchronous
public Future<String> tarefaDemorada() {
return service.submit(new Callable<String>() {
@Override
public String call() throws Exception {
StringBuffer buf = new StringBuffer();
//... tarefa demorada
return buf.toString();
}
});
}
}
78. JAVAEE7 Exercícios
•11. Escreva um Singleton Timer que execute uma operação que
grave um String numa variável compartilhada depois de 1
minuto
•12. Escreva um bean que utilize o serviço do exercício anterior,
lendo o String e retornando o resultado como um Future
•13. Escreva um managed bean que acesse como cliente, o bean
do exercício anterior, e uma página Web JSF que use Ajax para
atualizar o valor na tela quando o string estiver pronto.
80. JAVAEE7 Transações
•Unidade atômica de trabalho
• Ou todas as etapas terminam com sucesso ou processo é desfeito
•Commit e rollback
• Sub-operações são realizadas e resultados temporários são obtidos
• No final, a transação é cometida (commit) e o resultado final torna-se
durável se cada sub-operação funcionar com sucesso
• Se uma sub-operação falhar, as alterações realizadas são revertidas
(rollback) e os dados voltam aos estados anteriores
Estado Inicial
Transação
ocorrendo
Estado Final
Transação desfeita (rolled-back)
Transação cometida
Falha!
Sucesso!
81. JAVAEE7 Transações em EJB
•A especificação EJB não suporta transações aninhadas. Se uma
transação começa quando já existe um contexto transacional, ela pode:
•Continuar o contexto transacional existente
•Interromper o contexto transacional existente
•Iniciar um novo contexto transacional
•O controle transacional em EJB resume-se a demarcação: determinar o
início e o fim. Há duas formas de demarcar transações:
•Explícita, ou programática (Bean-Managed Transactions – BMT)
•Implícita, ou declarativa (Container-Managed Transactions- CMT) - default
82. JAVAEE7 Bean-Managed Transactions (BMT)
•Demarcação de transações através do uso explícito de APIs Java de
controle transacional como
•java.sql.Connection (JDBC)
•javax.jms.Session (JMS)
•EntityTransaction (JPA)
•UserTransaction (JTA)
•O uso dessas APIs é proibido em CMT (Container-Managed Transactions)
•É preciso configurar BMT via XML ou @TransactionManagement:
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class Fachada { ... }
83. JAVAEE7 Propagação de transações
•Transações terminam no mesmo lugar onde começaram
•O contexto da transação será propagado para todos os métodos
chamados (se eles não iniciarem nova transação)
•Se métodos chamados iniciarem nova transação, a transação principal será
suspensa até que o método termine.
Cliente
Session
EJB
Session
Bean
Entity
Local
Entity
Entity
Local
Entity
Session
EJB
Session
Bean
Entity
Local
Entity
Transação suspensa (será reiniciada
quando método retornar)
Nova transação
iniciada no container
84. JAVAEE7 Bean-Managed Transactions (BMT)
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class Bean {
@Resource DataSource ds;
public void processarPedido (String id, int quantidade) {
Connection con = ds.getConnection();
try {
con.setAutoCommit(false);
atualizarEstoque(id, quantidade);
con.commit();
} catch (Exception e) {
try {
con.rollback();
} catch (SQLException sqx) {}
}
}
}
Bean usa transações do JDBC e
precisa ser declarado como BMT
85. JAVAEE7 UserTransaction
•javax.transaction.UserTransaction, pode ser usada em qualquer
componente EJB e clientes para demarcar transações distribuídas
(two-phase commit)
•UserTransaction é usada internamente em transações declarativas
(CMT) e sua API pode ser usada explicitamente em BMT
•Principais métodos de UserTransaction usados em BMT:
•begin(): marca o início
•commit(): marca o término
•rollback(): condena a transação
87. JAVAEE7 Transações iniciadas no cliente
• Qualquer cliente pode iniciar transações JDBC e JMS
– Cliente pode ser standalone, servlet, bean, etc.
• Clientes remotos precisam obter uma instância da classe
UserTransaction através de JNDI
– Pode necessitar de configuração proprietária
– Geralmente disponibilizado em java:comp/UserTransaction
Context ctx = new InitialContext();
UserTransaction ut = (UserTransaction)
ctx.lookup("java:comp/UserTransaction");
ut.begin();
// realizar operações
ut.commit();
88. JAVAEE7 Container-Managed Transactions (CMT)
•É default (mas pode ser declarado em classes e métodos):
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class Fachada { … }
•Não demarca blocos de código.A granularidade mínima é o método.
•As transações são gerenciadas por default de acordo com a politica REQUIRED,
que garante um contexto transacional (continua existente, ou cria novo).
•CMT não permite APIs transacionais (isto inclui métodos da API de transações
de java.sql, javax.jms, EntityTransaction e UserTransaction).
89. JAVAEE7 Atributos (políticas de propagação)
• O elemento @TransactionAttribute define a política de propagação
das transações do componente ou método (seu comportamento ao
ser chamado dentro ou fora de contexto transacional)
• Valores suportados (depende do tipo de bean)
– TransactionAttributeType.NOT_SUPPORTED
– TransactionAttributeType.SUPPORTS
– TransactionAttributeType.REQUIRED
– TransactionAttributeType.REQUIRES_NEW
– TransactionAttributeType.MANDATORY
– TransactionAttributeType.NEVER
• Declaração no nível da classe não afeta métodos @PostConstruct,
etc. (callbacks) que não têm contexto transacional especificado
90. JAVAEE7 REQUIRED
•Método tem que ser chamado dentro do escopo de uma transação
• Se não existe transação, uma nova é criada e dura até que o método termine (é
propagada para todos os métodos chamados)
• Se já existe uma transação iniciada pelo cliente, o bean é incluído no seu escopo
durante a chamada do método
Cliente
(EJB ou aplicação)
EJB
Cliente
(EJB ou aplicação)
EJB
Cliente não está no
contexto uma transação
Cliente está no contexto de
uma transação
Bean cria nova transação
Bean é incluido na transação
chama metodo() com
atributo REQUIRED
chama metodo() com
atributo REQUIRED
91. JAVAEE7 SUPPORTS
•Método suporta transações
• Será incluído no escopo da transação do cliente se existir
• Se ele for chamado fora do escopo de uma transação ele realizará suas
tarefa sem transações e pode chamar objetos que não suportam transações
Cliente
(EJB ou aplicação)
EJB
Cliente
(EJB ou aplicação)
EJB
Cliente não está no
contexto uma transação
Cliente está no contexto de
uma transação
Método é executado sem transação
Bean é incluido na transação
chama metodo() com
atributo SUPPORTS
chama metodo() com
atributo SUPPORTS
92. JAVAEE7 REQUIRES_NEW
•Uma nova transação, iniciada no escopo do bean, é sempre criada
• Estando ou não o cliente no escopo de uma transação, o bean irá iniciar
uma nova transação que iniciará e terminará no bean.
Transação é suspensa
Transação é reiniciada
Cliente
(EJB ou aplicação)
EJB
Cliente
(EJB ou aplicação)
EJB
Cliente não está no
contexto uma transação
Cliente está no contexto de
uma transação
chama metodo() com
atributo REQUIRES_NEW
Bean cria nova transação
Bean cria nova transação
chama metodo() com
atributo REQUIRES_NEW
93. JAVAEE7 NOT_SUPPORTED
•Método não suporta transações
• Se o método for chamado pelo cliente no escopo de uma transação, a
mesma será suspensa enquanto durar a chamada do método (não haverá
propagação de transações do cliente)
Transação é suspensa
Transação é reiniciada
Cliente
(EJB ou aplicação)
Cliente não está no
contexto uma transação
Cliente está no contexto de
uma transação
chama metodo() com
atributo NOT_SUPPORTED
chama metodo() com
atributo NOT_SUPPORTED
Método é executado sem transação
EJB
Método é executado sem transação
Cliente
(EJB ou aplicação)
EJB
94. JAVAEE7 MANDATORY
•Método só pode ser chamado no escopo de uma transação do cliente
• Se o método for chamado fora de uma transação, ele causará
javax.transaction.TransactionRequiredException (ou
javax.ejb.TransactionRequiredLocalException)
Método provoca exceção
Exception
Cliente
(EJB ou aplicação)
EJB
Cliente está no contexto de
uma transação
Bean é incluido na transação
chama metodo() com
atributo MANDATORY
Cliente
(EJB ou aplicação)
EJB
Cliente não está no
contexto uma transação
chama metodo() com
atributo MANDATORY
95. JAVAEE7 NEVER
•Método nunca pode ser chamado no escopo de uma transação
• Se o cliente que chama o método for parte de uma transação, o bean
irá provocar um RemoteException (ou EJBException em clientes locais)
Remote ou EJBException
Cliente
(EJB ou aplicação)
EJB
Cliente não está no
contexto uma transação Método é executado sem transação
chama metodo() com
atributo NEVER
Método provoca exceção
EJB
Cliente
(EJB ou aplicação)
Cliente está no contexto de
uma transação
chama metodo() com
atributo NEVER
96. JAVAEE7 Destino de uma transação CMT
•Apenas exceções do sistema (Runtime, Remote, EJBException) provocam
rollback automático da transação
•Chamar rollback() explicitamente não é permitido em CMT. Para que uma
exceção dispare automaticamente um rollback há duas alternativas:
•Anotar a exceção com @ApplicationException
•Condenar a transação CMT usando setRollbackOnly() de EJBContext. O
status está disponível via getRollbackOnly():
try {
return new ClientePK(clienteDAO.create(clienteDTO));
} catch (UsuarioJaExisteException e) {
if (!ctx.getRollbackOnly())
ctx.setRollbackOnly(); // doom this transaction
throw e;
}
97. JAVAEE7 Transações em Message-driven beans
•Como um MDB não é chamado diretamente, não propaga contexto
transacional, mas podem iniciar novas transações
• A transação deve iniciar e terminar dentro do método onMessage()
•É mais simples usar CMT com MDBs
• Com CMT, a entrega da mensagem é parte da transação, já que é o
container que a inicia: se houver rollback, container pode reenviar a
mensagem
• Com BMT, é preciso provocar um EJBException para evitar o
acknowledgement e forçar o reenvio
• Em CMT suportam apenas as políticas NOT_SUPPORTED e REQUIRED
98. JAVAEE7 Transações em Stateful Session Beans
•O estado de Stateful Session Beans é mantido em variáveis de
instância que não são recuperadas em caso de rollback
•É preciso guardar o estado anterior do bean para reverter caso a
transação falhe
• Se o bean inicia a transação (BMT), pode-se guardar o estado antes
do begin e recuperar após o rollback
• Se o container iniciar a transação (CMT) é preciso implementar
callbacks (SessionSynchronization)
99. JAVAEE7 Interface SessionSynchronization
• Pode ser implementada por Stateful Session Beans para capturar
eventos lançados nos pontos de demarcação
• void afterBegin():
– Chamado logo após o início da transação.
– Guarde o estado do bean para recuperação em caso de falha
• void beforeCompletion():
– Chamado antes do commit() ou rollback().
– Geralmente vazio, mas pode ser usado pelo bean para abortar a transação se
desejar (usando setRollbackOnly())
• void afterCompletion(boolean state):
– Chamado após o commit() ou rollback().
– Se a transação terminou com sucesso, state é true; caso contrário, é false deve-se
restaurar o estado do bean aos valores guardados em afterBegin()
100. JAVAEE7 Exercícios
•14. Os métodos do bean LoteriaBean falham aleatoriamente (a
chance é de 25%). SorteioBean precisa ler o último valor do banco
e substituir pelo novo valor apenas se o novo valor for maior, e
permitir apenas 5 chamadas pelo mesmo cliente. Configure o
mínimo de transações em SorteioBean para que a aplicação
funcione corretamente (use SessionSynchronization se
necessário).
102. JAVAEE7 Segurança em EJB
•A segurança em EJB consiste do controle de acesso
(autorização) a métodos públicos e trechos de código
•A configuração da autorização pode ser declarativa e/ou
programática
•A configuração declarativa pode ser feita através de anotações
antes de cada método ou via web.xml
•A configuração programática utiliza métodos de EJBContext e
permite controlar acesso de trechos de métodos
103. JAVAEE7 Autorização em EJB: anotações
@DeclareRoles({"amigo", "administrador"})
@Stateless public class ImagemBean {
@RolesAllowed("administrador")
public void removerUsuario(Usuario u) { ... }
@RolesAllowed("amigo")
public List<Usuario> listaDeUsuarios() { ... }
@PermitAll
public String getInfo() { ... }
@RolesAllowed("**")
public String getFreeStuff() { ... }
@DenyAll
public String loggingData() { ... }
}
104. JAVAEE7 Autorização em ejb-jar.xml
•Raramente usado por desenvolvedores (já que toda a segurança
pode ser configurada por anotações)
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" ... >
<enterprise-beans>
<session>
<ejb-name>testeBean</ejb-name>
<ejb-class>testebean.TesteBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<security-role>
<role-name>administrador</role-name>
</security-role>
<method-permission>
<role-name>administrador</role-name>
<method>
<ejb-name>testeBean</ejb-name>
<method-name>*</method-name>
</method>
</method-permission> ...
</assembly-descriptor>
</ejb-jar>
105. JAVAEE7 Propagação de identidade
•@RunAs("role")
• Declarado antes da declaração de classe permite que o componente
execute usando um role (permissão) específico
• Permite que componente obtenha uma permissão mesmo que ela
não tenha sido propagada pelo container cliente
@MessageDriven
@RunAs("administrador")
public class TestEJB { ... }
<message-driven>
<ejb-name>TestEJB</ejb-name>
<ejb-class>br.com.ejb.examples.TestEJB</ejb-class>
<security-identity>
<run-as>
<role-name>administrador</role-name>
</run-as>
</security-identity>
</message-driven>
O container confia
na identidade
propagada (não
autentica de novo)
106. JAVAEE7 Autorização com EJBContext
•Métodos de javax.ejb.EJBContext
• Herdados por SessionContext e MessageDrivenContext
• Permite controle de acesso em trechos de métodos
• Mesmos métodos, mas com nomes diferentes
• Caller no contexto EJB é o User no contexto Web
String loggedUser = ctx.getCallerPrincipal().getName();
if( !ctx.isCallerInRole("administrador")) {
if (!loggedUser.equals("cerebro")) {
throw new EJBAccessException("...");
}
}
107. JAVAEE7 Exercícios
•15. Configure o acesso aos métodos de LojaBean para que
•a) O método getProdutos() possa ser acessado por qualquer usuário
•b) O método getProduto() e getCarrinho() possam ser acessados por
usuários que tenham o role "cliente"
•c) O método setProduto() e deleteProduto() possam ser acessados por
usuários que tenham o role "admin"
•Use a aplicação Web fornecida que fornece os usuários, senhas, roles e
mecanismo de autenticação (é possível que você tenha que configurar
usuarios, senhas e roles no seu servidor)
108. JAVAEE7 Exercícios de revisão
•Faça os exercícios 5, 7, 10 e 14* da aplicação Biblioteca
•5) Aplicação Web com EJB e CDI (use aplicação parcialmente
concluida em /projeto-parcial)
•7) Singleton Session Beans (exercício parcialmente resolvido)
•10) Stateful Session Beans (empréstimo de livros)
•14) Message-Driven Beans (processamento CSV assíncrono)
*Exercicios: http://www.argonavis.com.br/download/exercicios_javaee.html
109. JAVAEE7 Referências
• EJB 3.2 Expert Group. JSR 345: Enterprise JavaBeans,Version 3.2. Oracle.
2013. http://download.oracle.com/otndocs/jcp/ejb-3_2-fr-spec/index.html
• Eric Jendrock et al. The Java EE 7 Tutorial. Oracle. 2014. https://
docs.oracle.com/javaee/7/JEETT.pdf
• Linda deMichiel and Bill Shannon. JSR 342.The Java Enterprise Edition
Specification.Version 7. Oracle, 2013. http://download.oracle.com/otn-
pub/jcp/java_ee-7-fr-spec/JavaEE_Platform_Spec.pdf
•Arun Gupta. Java EE 7 Essentials. O’Reilly and Associates. 2014.