Java EE 7 In Action Rodrigo Cândido da Silva @rcandidosilva http://about.me/rcandidosilva Agenda ! GUJavaSC ! Java EE 7 ! Plataforma Java EE ! Web Socket API 1.0 ! Batch API 1.0 ! Concurrency Utilities ! JSON API 1.0 ! JAX-RS 2.0 ! Java Message Service 2.0 ! JavaServer Faces 2.2 ! Bean Validation 1.1 ! Java Persistence API 2.1 Iniciativas ! ! ! ! ! ! ! ! Eventos mensais; Blog; Redes sociais; Listas de discussão; Organização de eventos; Projetos open source; Adopt an JSR; … Como Colaborar ! Site: ! http://gujavasc.org ! Twitter ! https://twitter.com/gujavasc ! Github ! https://github.com/gujavasc ! Facebok: ! http://facebook.com/groups/gujavasc Plataforma Java ! Java SE ! Java ME ! Java EE Java Enterprise Edition ! Suporte ao desenvolvimento de aplicações “enterprise” ! Aplicações distribuídas, seguras, escaláveis, de alta disponibilidade e com baixo custo de manutenção ! Plataforma para desenvolvimento de software de pequeno, médio e grande porte em múltiplas camadas de componentes ! Componentes “rodam” em um servidor Java EE Java Enterprise Edition Java Enterprise Edition ! Serviços oferecidos pelos containeres Java EE: ! ! ! ! ! ! ! ! ! Gestão de memória, ciclo de vida de objetos Conexões, Transações, Serviço de nomes Segurança Tolerância a falhas Integração WebServices Clustering Alta disponibilidade Confiabilidade... Java EE History Java EE 7 Java EE 6 Java EE 5 J2EE 1.4 J2EE 1.3 CMP, Connector Architecture Web Services Mgmt, Deployment, Async Connector Ease of Development, EJB 3, JPA, JSF, JAXB, JAX-WS, StAX, SAAJ Pruning, Extensibility Ease of Dev, CDI, JAX-RS JMS 2, Batch, TX, Concurrency, Interceptor, WebSocket, JSON JAX-RPC, CMP/ BMP, JSR 88 Web Profile Servlet 3, EJB 3.1 Lite Web Profile JAX-RS 2 Java EE 7 Themes Java EE 7 Overview JSP 2.2 JSF 2.2 JAX-RS 2.0 EL 3.0 Concurrency Utilities (JSR 236) Servlet 3.1 Common Annotations 1.1 Interceptors 1.1 Managed Beans 1.0 Connector 1.6 New EJB 3.2 JPA 2.1 Major Release CDI 1.1 JTA 1.2 Updated JMS 2.0 Bean Validation 1.1 Portable Extensions Batch Applications (JSR 352) Java API for JSON (JSR 353) Java API for WebSocket (JSR 356) Utilizando HTML 5 ! ! ! ! WebSocket 1.0 JAX-RS 2.0 JSON-P JavaServer Faces 2.2 WebSocket 1.0 ! Web Socket ! Modelo de mensagem bi-direcional, full-duplex, TCP ! Definido pelo W3C ! Web Socket API 1.0 ! Modelo de programação para Web Sockets da plataforma Java ! Anotações (@ServerEndpoint, @ClientEndpoint) ! Lifecycle callback handlers ! Permite empactá-los em aplicações Java EE WebSocket 1.0 Connected ! open open message Client message error message Server message close Disconnected WebSocket 1.0 Client Remote Endpoint Session Message Handler Remote Endpoint Internet Session Message Handler Client Remote Endpoint Session WebSocket Endpoint Client Message Handler WebSocket 1.0 Connection Lifecycle @ServerEndpoint(”/chat”) public class ChatServer { Set<Session> peers = ... @OnOpen public void onOpen(Session peer) { peers.add(peer); } @OnClose public void onClose(Session peer) { peers.remove(peer); } ... WebSocket 1.0 WebSocket Communication ... @OnMessage public void message(String message, Session client) throws IOException { for (Session session : peers) { if (!session.equals(client)) { session.getRemote().sendObject(message); } } } } JAX-RS 2.0 ! ! ! ! ! ! Definição de APIs para cliente Validar parâmetros via Bean Validation Processamento assíncrono (server-side) Possível definir filtros e interceptadores Content negociation (server-side) Suporte a Hypermedia (processar links) JAX-RS 2.0 Client API // Get instance of Client Client client = ClientBuilder.newClient(); // Get customer name for the shipped products String name = client.target(“../orders/{orderId}/customer”) .pathParam(”orderId", ”10”) .queryParam(”shipped", ”true”) .request() .get(String.class); JAX-RS 2.0 Server Service @Path("/atm/{cardId}") public class AtmService { @GET @Path("/balance") @Produces("text/plain") public String balance( @PathParam("cardId") String card, @QueryParam("pin") String pin) { return Double.toString(getBalance(card, pin)); } } JSON API 1.0 ! ! ! ! API para parser e geração JSON Streaming API Object Model API Realiza o binding de JSON para objetos Java JSON API 1.0 Writing JSON (Object Model API) JsonArray value = Json.createArrayBuilder() [ { .add(Json.createObjectBuilder() .add("type", "home") "type": "home , .add("number", "212 555-1234") "number": "212 555-1234" ) }, .add(Json.createObjectBuilder() { .add("type", "fax") "type": "fax , .add("number", "646 555-4567") "number": "646 555-4567" } ) .build(); ] JSON API 1.0 Reading JSON (Streaming API) { "firstName": "John", "lastName": "Smith", "age": 25, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] } Event event = parser.next(); // START_OBJECT event = parser.next(); // KEY_NAME event = parser.next(); // VALUE_STRING String name = parser.getString(); // "John” JavaServer Faces 2.2 Suporte ao Flow Faces Integração com HTML 5 Utilização filas para múltiplas requisições Ajax Injeção em todos os artefatos JSF (lifecycle + converters + validators) ! Novos componentes: FileUpload & BackButton ! Mais simples: ! ! ! ! ! Tag Handler não é mais necessário ! URLs compactas para mapear TagLibraries JavaServer Faces 2.2 Pass-Through HTML 5 Components <html> ... <input type=“color” jsf:value=“#{colorBean.color2}” /> <input type=“date” jsf:value=“#{calendarBean.date1}” /> ... </html> JavaServer Faces 2.2 Faces Flow Batch API 1.0 ! Serve para executar tarefas não-iterativas e processos longos ! Processamento computacional intensivo ! Pode ser executado em sequencial ou paralelo ! Pode ser inicializado com: ! Chamada adhoc ! Agendado ! Não há uma API de agendamento incluída Batch API 1.0 ! ! ! ! Job: um processo a ser executado Step: uma fase do job a ser executada JobOperator: gerencia o ciclo do processamento JobRepository: metadados dos jobs Batch API 1.0 Step Example @Named(“accountReader") ...implements ItemReader... { public Account readItem() { // read account using JPA <step id=”sendStatements”> <chunk reader=”accountReader” processor=”accountProcessor” writer=”emailWriter” item-count=”10” /> </step> @Named(“accountProcessor") ...implements ItemProcessor... { Public Statement processItems(Account account) { // read Account, return Statement @Named(“emailWriter") ...implements ItemWriter... { public void writeItems(List<Statements> statements) { // use JavaMail to send email Concurrency Utilities ! Define uma API simples e padronizada para utilização de concorrência, sem comprometer a integridade do container Concurrency Utilities Managed Task Executor public class TestServlet extends HTTPServlet { @Resource(name=“concurrent/MyExecutorService”) ManagedExecutorService executor; Future future = executor.submit(new MyTask()); class MyTask implements Runnable { public void run() { ... // Task logic } } } Java Message Service 2.0 Menos verboso Redução de “boilerplate code” Suporte a injeção de dependência Connection, Session e outros objetos são automaticamente finalizados (obj.close()) ! Simplificação na API do Java SE e EE ! ! ! ! Java Message Service 2.0 Old Client API Java Message Service 2.0 Simplified API @Inject private JMSContext context; @Resource(mappedName = "jms/inboundQueue") private Queue inboundQueue; public void sendMessage (String payload) { context.createProducer().send(inboundQueue, payload); } Bean Validation 1.1 ! ! ! ! Integração com outras especificações Validação em parâmetros e/ou retorn de métodos Validação elementos de uma coleção Constraint composition com OR Bean Validation 1.1 Method Level Constraints public void placeOrder( @NotNull String productName, @NotNull @Max(“10”) Integer quantity, @Customer String customer) { . . . } @Future public Date getAppointment() { . . . } Java Persistence API 2.1 ! ! ! ! ! Schema generation Persistence Contexts não sincronizados Bulk update/delete using Criteria API User-defined functions using FUNCTION Stored Procedure Query Java Persistence API 2.1 Schema Generation Properties ! javax.persistence.schema-generation.[database|scripts].action ! “none”, “create”, “drop-and-create”, “drop” ! javax.persistence.schema-generation.scripts.[create|drop]-target ! javax.persistence.schema-generation.[create|drop]-script-source ! javax.persistence.sql-load-script-source ! javax.persistence.schema-generation.[create|drop]-source ! “metadata”, “script”, “metadata-then-script”, “script-thenmetadata” Java Persistence API 2.1 Stored Procedures @Entity @NamedStoredProcedureQuery(name="topGiftsStoredProcedure”, procedureName="Top10Gifts") public class Product { StoredProcedreQuery query = EntityManager.createNamedStoredProcedureQuery( "topGiftsStoredProcedure"); query.registerStoredProcedureParameter(1, String.class, ParameterMode.INOUT); query.setParameter(1, "top10"); query.registerStoredProcedureParameter(2, Integer.class, ParameterMode.IN); query.setParameter(2, 100); . . . query.execute(); String response = query.getOutputParameterValue(1); Outras APIs ! Servlet 3.1 ! Non-blocking I/O, upgrade to WebSocket, security… ! CDI 1.1 ! Global enablement, @AroundConstruct, @Vetoed… ! EL 3.0 ! Lambda expressions, collections, operators, standalone API ! EJB 3.2 ! Truncating CMP/BMP… Java EE 8 ! ! ! ! ! Arquitetura Cloud Multi tenancy para SaaS Modularidade baseada no Jigsaw Suporte NoSQL Entrega incremental de JSRs ! glassfish.org/survey Perguntas e Respostas ?