JUDCON India 2014 Java EE 7 talk

Embed Size (px)

Citation preview

2. Java EE 7 Candidate JSRs 3. Java EE, Past, Present & Future 4. WebSocket Primer HTTP is half duplex and traditional flavors of server push were long polling, Comet/AJAX Inefficient and wasteful WebSocket to the rescue ! TCP based, bi-directional, full-duplex messaging Originally proposed as part of HTML5 W3C defined Javascript API 5. WebSocket Primer In 4 lines Establish connection (Single TCP Connection) Send messages in both directions (Bi-directional) Send messages independent of each other (Full Duplex) End Connection 6. Java API for WebSocket Higher level API for WebSocketBoth client and server-side (Java SE and Java EE)Both declarative and programmatic 7. Java API for WebSocket @ServerEndpoint(/chat) public class ChatServer { Set peers = ... @OnOpen public void onOpen(Session peer) { peers.add(peer); } @OnClose public void onClose(Session peer) { peers.remove(peer); } ... 8. Java API for WebSocket ... @OnMessage public void message(String message, Session client) throws IOException { for (Session session : peers) { if (!session.equals(client)) { session.getRemote().sendObject(message); } } } } 9. Java API for JSON Processing API to parse, generate, transform, query JSON Object Model and Streaming API -- similar to DOM and StAX Binding JSON to Java objects forthcoming 10. Java API for JSON Processing Writing JSON (Object Model API) JsonArray value = Json.createArrayBuilder()[ {.add(Json.createObjectBuilder()"type": "home, "number": "212 555-1234" }, { "type": "fax, "number": "646 555-4567" }.add("type", "home") .add("number", "212 555-1234") ) .add(Json.createObjectBuilder() .add("type", "fax") .add("number", "646 555-4567") ).build();] 11. Java API for JSON Processing 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 12. Batch Applications for the Java Platform API for robust batch processing targeted to Java EE, Java SE 13. Batch Applications for the Java Platform Step Example 14. Concurrency Utilities for Java EE Provides simple, safe API for concurrency in Java EE Builds on Java SE concurrency java.util.concurrent.ExecutorService Relatively low-level API and provides ManagedExecutorService ManagedScheduledExecutorService ManagedThreadFactory ContextServiceContext Propagation (except Transactions !!) 15. Concurrency Utilities for Java EE 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 } } } 16. JMS 2 API modernization using dependency injection Delivery delay, async send, MDB alignment, JMS resource definition Fixes, clarifications 17. JMS 2 Old API @Resource(lookup = "java:global/jms/demoConnectionFactory") ConnectionFactory connectionFactory; @Resource(lookup = "java:global/jms/demoQueue") Queue demoQueue; public void sendMessage(String payload) { try { Connection connection = connectionFactory.createConnection(); try { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer messageProducer = session.createProducer(demoQueue); TextMessage textMessage = session.createTextMessage(payload); messageProducer.send(textMessage); } finally { connection.close(); } } catch (JMSException ex) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } 18. JMS 2 Simplified API @Inject private JMSContext context; @Resource(mappedName = "jms/inboundQueue") private Queue inboundQueue; public void sendMessage (String payload) { context.createProducer().send(inboundQueue, payload); } 19. JMS 2 JMS Resource Definition @JMSConnectionFactoryDefinition( name="java:global/jms/demoConnectionFactory", interfaceName= "javax.jms.ConnectionFactory", description="ConnectionFactory to use in demonstration")@JMSDestinationDefinition( name = "java:global/jms/demoQueue", description = "Queue to use in demonstration", interfaceName = "javax.jms.Queue", destinationName="demoQueue") 20. JMS 2/EJB 3.2 More Standard MDB Properties @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty( propertyName = "destinationLookup", propertyValue = "jms/OrderQueue"), @ActivationConfigProperty( propertyName = "connectionFactoryLookup", propertyValue = "jms/MyConnectionFactory")}) public class OrderListener implements MessageListener { ... public void onMessage(Message message) { ... } ... } 21. JAX-RS 2 Client APIMessage Filters & Entity InterceptorsAsynchronous Processing Server & ClientHypermedia SupportContent negotiation 22. JAX-RS 2 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); 23. JAX-RS 2 Logging Filterpublic class RequestLoggingFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) { log(requestContext); // Non-wrapping => returns without invoking next filter } ... } 24. Bean Validation 1.1 Method constraintsBean Validation artifacts injectableFixes, clarifications and enhancements 25. Bean Validation 1.1 Method Level Constraintspublic void placeOrder( @NotNull String productName, @NotNull @Max(10) Integer quantity, @Customer String customer) { ... } @Future public Date getAppointment() { ... } 26. JPA 2.1 Schema generationStored proceduresUnsynchronized persistence contextsEntity convertersEntity GraphsDynamic Named QueriesFixes and enhancements 27. JPA 2.1 Schema Generation Properties javax.persistence.schema-generation.[database|scripts].action - none, create, drop-and-create, drop javax.persistence.schema-generation.[create|drop]-source -metadata, script, metadata-then-script, script-then- metadata javax.persistence.schema-generation.[create|drop]-script-source javax.persistence.schema-generation.scripts.[create|drop]-target javax.persistence.sql-load-script-source 28. JPA 2.1 Stored Procedures @Entity @NamedStoredProcedureQuery(name="topGiftsStoredProcedure, procedureName="Top10Gifts") public class Product { StoredProcedureQuery 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); 29. JTA 1.2Declarative transactions outside EJBTransaction scope - @TransactionScoped 30. JTA 1.2 @Transactional Annotation @Inherited @InterceptorBinding @Target({TYPE, METHOD}) @Retention(RUNTIME) public @interface Transactional { TxType value() default TxType.REQUIRED; Class[] rollbackOn() default {}; Class[] dontRollbackOn() default {}; } @Transactional(rollbackOn={SQLException.class}, dontRollbackOn={SQLWarning.class}) public class UserService {...} 31. JSF 2.2 HTML5 Support@FlowScoped@ViewScoped for CDIManaged beans deprecated/CDI alignmentStateless viewsResource library contractsFile upload componentCross-Site Request Forgery handling support 32. JSF 2.2 Pass-Through HTML 5 Components ... ... 33. JSF 2.2 Faces Flows @Named @FlowScoped(id="flow-a") public class FlowABean implements Serializable { public String getName() { return "FlowABean"; } public String getReturnValue() { return "/return1"; } @Produces public Flow getFlow(FlowBuilder builder) { builder.startNode("router1"); builder.flowReturn("success").fromOutcome("/complete"); builder.flowReturn("errorOccurred").fromOutcome("error"); builder.switchNode("router1") .navigationCase().condition("#{facesFlowScope.customerId == null}") .fromOutcome("create-customer") .defaultOutcome("view-customer"); builder.viewNode("create-customer"); builder.viewNode("maintain-customer-record"); builder.methodCall("upgrade-customer") .method("#{maintainCustomerBean.upgradeCustomer}").defaultOutcome("view-customer"); builder.initializer("#{maintainCustomerBean.initializeFlow}"); builder.finalizer("#{maintainCustomerBean.cleanUpFlow}"); return builder.getFlow(); } 34. Others Servlet 3.1: Non-blocking I/O, Security Enhancements CDI 1.1: Global enablement, @AroundConstruct, @Vetoed EL 3.0: Lambda expressions, collections, operators, standalone API EJB 3.2: Truncating CMP/BMP 35. Java EE 8 JSON-B JCache CDI.next() More CDI/EJB alignment Cloud, PaaS, multitenancy/SaaS Security? Testability? Modularity? Management/deployment APIs? NoSQL? Action-oriented Web framework/HTML 5? JMS.next()? 36. Resources Java EE Tutorials http://docs.oracle.com/javaee/7/tutorial/doc/home.htm http://www.programming-simplified.com/index.htmlDigging Deeper http://docs.oracle.com/javaee/7/firstcup/doc/home.htm https://glassfish.java.net/hol/ https://java.net/projects/cargotracker/Java EE 7 Transparent Expert Groups http://javaee-spec.java.netJava EE 7 Reference Implementation http://glassfish.org 37. Cargo Tracker Planned Reference Architectural Blueprint for Java EE 7 utilizing DDD Clean DDD design utilizing almost all the JSRs for Java EE 7 Demonstrates building of modern mobile/desktop applications utilizing Java EE 7 Project code is available at https://java.net/projects/cargotracker/pages/HomeContributors/Reviewers needed. Ask Reza Rahman/myself for more details