JavaEE.Next():Java EE 7,8
and Beyond
Vijay Nair
vijay.nair@oracle.com
@FusionVJ
Java EE 7 – Candidate JSRs
Java EE, Past, Present & Future
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
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
Java API for WebSocket
•

Higher level API for WebSocket

•

Both client and server-side (Java SE and Java EE)

•

Both declarative and programmatic
Java API for WebSocket
@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);
}
...
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);
}
}
}
•

}
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
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();

]
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”
Batch Applications for the Java Platform
API for robust batch processing targeted to Java EE, Java SE
Batch Applications for the Java Platform
Step Example
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
ContextService

•

Context Propagation (except Transactions !!)
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
}
}
}
JMS 2
•

•

•

API modernization using dependency injection
Delivery delay, async send, MDB alignment, JMS
resource definition
Fixes, clarifications
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);
}
}
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);
}
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")
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) { ... }
...
}
JAX-RS 2
•

Client API

•

Message Filters & Entity Interceptors

•

Asynchronous Processing – Server & Client

•

Hypermedia Support

•

Content negotiation
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);
JAX-RS 2
Logging Filter

public class RequestLoggingFilter
implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext
requestContext) {
log(requestContext);
// Non-wrapping => returns without invoking next filter
}
...
}
Bean Validation 1.1
•

Method constraints

•

Bean Validation artifacts injectable

•

Fixes, clarifications and enhancements
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() {
...
}
JPA 2.1
•

Schema generation

•

Stored procedures

•

Unsynchronized persistence contexts

•

Entity converters

•

Entity Graphs

•

Dynamic Named Queries

•

Fixes and enhancements
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
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);
JTA 1.2

•

Declarative transactions outside EJB

•

Transaction scope - @TransactionScoped
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 {...}
JSF 2.2
•

HTML5 Support

•

@FlowScoped

•

@ViewScoped for CDI

•

Managed beans deprecated/CDI alignment

•

Stateless views

•

Resource library contracts

•

File upload component

•

Cross-Site Request Forgery handling support
JSF 2.2
Pass-Through HTML 5 Components
<html>
...
<input type=“color” jsf:value=“#{colorBean.color2}” />
<input type=“date” jsf:value=“#{calendarBean.date1}” />
...
</html>
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();
•

•

}
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…
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()?
Resources
•

Java EE Tutorials
http://docs.oracle.com/javaee/7/tutorial/doc/home.htm
http://www.programming-simplified.com/index.html

•

Digging 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.net

•

Java EE 7 Reference Implementation
http://glassfish.org
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/Home

Contributors/Reviewers needed. Ask Reza
Rahman/myself for more details

JUDCON India 2014 Java EE 7 talk

  • 2.
    JavaEE.Next():Java EE 7,8 andBeyond Vijay Nair vijay.nair@oracle.com @FusionVJ
  • 3.
    Java EE 7– Candidate JSRs
  • 4.
    Java EE, Past,Present & Future
  • 5.
    WebSocket Primer • • HTTP ishalf 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
  • 6.
    WebSocket Primer • In 4lines Establish connection (Single TCP Connection) Send messages in both directions (Bi-directional) Send messages independent of each other (Full Duplex) End Connection
  • 7.
    Java API forWebSocket • Higher level API for WebSocket • Both client and server-side (Java SE and Java EE) • Both declarative and programmatic
  • 8.
    Java API forWebSocket @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); } ...
  • 9.
    Java API forWebSocket ... @OnMessage public void message(String message, Session client) throws IOException { for (Session session : peers) { if (!session.equals(client)) { session.getRemote().sendObject(message); } } } • }
  • 10.
    Java API forJSON Processing • • • API to parse, generate, transform, query JSON Object Model and Streaming API -- similar to DOM and StAX Binding JSON to Java objects forthcoming
  • 11.
    Java API forJSON 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(); ]
  • 12.
    Java API forJSON 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”
  • 13.
    Batch Applications forthe Java Platform API for robust batch processing targeted to Java EE, Java SE
  • 14.
    Batch Applications forthe Java Platform Step Example
  • 15.
    Concurrency Utilities forJava 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 ContextService • Context Propagation (except Transactions !!)
  • 16.
    Concurrency Utilities forJava 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 } } }
  • 17.
    JMS 2 • • • API modernizationusing dependency injection Delivery delay, async send, MDB alignment, JMS resource definition Fixes, clarifications
  • 18.
    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); } }
  • 19.
    JMS 2 Simplified API @Inject privateJMSContext context; @Resource(mappedName = "jms/inboundQueue") private Queue inboundQueue; public void sendMessage (String payload) { context.createProducer().send(inboundQueue, payload); }
  • 20.
    JMS 2 JMS ResourceDefinition @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")
  • 21.
    JMS 2/EJB 3.2 MoreStandard 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) { ... } ... }
  • 22.
    JAX-RS 2 • Client API • MessageFilters & Entity Interceptors • Asynchronous Processing – Server & Client • Hypermedia Support • Content negotiation
  • 23.
    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);
  • 24.
    JAX-RS 2 Logging Filter publicclass RequestLoggingFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) { log(requestContext); // Non-wrapping => returns without invoking next filter } ... }
  • 25.
    Bean Validation 1.1 • Methodconstraints • Bean Validation artifacts injectable • Fixes, clarifications and enhancements
  • 26.
    Bean Validation 1.1 MethodLevel Constraints public void placeOrder( @NotNull String productName, @NotNull @Max(“10”) Integer quantity, @Customer String customer) { ... } @Future public Date getAppointment() { ... }
  • 27.
    JPA 2.1 • Schema generation • Storedprocedures • Unsynchronized persistence contexts • Entity converters • Entity Graphs • Dynamic Named Queries • Fixes and enhancements
  • 28.
    JPA 2.1 Schema GenerationProperties 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
  • 29.
    JPA 2.1 Stored Procedures @Entity @NamedStoredProcedureQuery(name="topGiftsStoredProcedure”, procedureName="Top10Gifts") publicclass 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);
  • 30.
    JTA 1.2 • Declarative transactionsoutside EJB • Transaction scope - @TransactionScoped
  • 31.
    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 {...}
  • 32.
    JSF 2.2 • HTML5 Support • @FlowScoped • @ViewScopedfor CDI • Managed beans deprecated/CDI alignment • Stateless views • Resource library contracts • File upload component • Cross-Site Request Forgery handling support
  • 33.
    JSF 2.2 Pass-Through HTML5 Components <html> ... <input type=“color” jsf:value=“#{colorBean.color2}” /> <input type=“date” jsf:value=“#{calendarBean.date1}” /> ... </html>
  • 34.
    JSF 2.2 Faces Flows @Named @FlowScoped(id="flow-a") publicclass 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(); • • }
  • 35.
    Others • • • • Servlet 3.1: Non-blockingI/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…
  • 36.
    Java EE 8 • • • • • • • • • • • • JSON-B JCache CDI.next() MoreCDI/EJB alignment Cloud, PaaS, multitenancy/SaaS Security? Testability? Modularity? Management/deployment APIs? NoSQL? Action-oriented Web framework/HTML 5? JMS.next()?
  • 37.
    Resources • Java EE Tutorials http://docs.oracle.com/javaee/7/tutorial/doc/home.htm http://www.programming-simplified.com/index.html • DiggingDeeper 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.net • Java EE 7 Reference Implementation http://glassfish.org
  • 38.
    Cargo Tracker Planned ReferenceArchitectural 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/Home Contributors/Reviewers needed. Ask Reza Rahman/myself for more details