SlideShare a Scribd company logo
1
50 features
of
Java EE 7
in
50 minutes
Arun Gupta, @arungupta
2
#NN: <spec>: <feature>
3
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
4
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
CDI 1.1 (JSR 346)
5
#01: CDI: Default enabling
Finer scanning control
Possible values: all, annotated, none!
Annotated behaves like in Java EE 6 (default)!
!
<beans ... version="1.1" bean-discovery-mode="all">!
<alternatives>!
<class>org.agoncal.book.MockGenerator</class>!
</alternatives>!
</beans>!
6
#02: CDI: @Vetoed
Veto the processing of the class or package
@Vetoed!
public class NonProcessedBean {

...!
}!
!
package-info.java
@Vetoed!
package com.non.processed.package;!
7
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
Bean Validation 1.1 (JSR 349)
8
#03: Bean Validation: Method validation
public class CardValidator {!
!
public CardValidator(@NotNull Algorithm algorithm) {!
this.algorithm = algorithm;!
}!
!
@AssertTrue!
public Boolean validate(@NotNull CreditCard creditCard) {!
return algorithm.validate(creditCard.getNumber());!
}!
}!
Pre/post conditions on method and constructors
9
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
Interceptors 1.2 (JSR 318)
10
#04: Interceptors: AroundConstruct
Interceptor associated with a constructor
public class LoggingInterceptor {!
!
@AroundConstruct!
private void init(InvocationContext ic) 

throws Exception{!
logger.fine("Entering constructor");!
ic.proceed();!
logger.fine("Exiting constructor");!
}!
!
@AroundInvoke!
public Object logMethod(InvocationContext ic) ... {
// ...!
}!
}!
11
#05: Interceptors: @Priority
Prioritizing interceptor bindings
PLATFORM_BEFORE (0), LIBRARY_BEFORE (1000), APPLICATION (2000),
LIBRARY_AFTER (3000), PLATFORM_AFTER (4000)!
@Interceptor!
@Loggable!
@Priority(Interceptor.Priority.LIBRARY_BEFORE + 10)!
public class LoggingInterceptor {!
!
@AroundInvoke!
...!
}!
12
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
Concurrency Utilities 1.0 (JSR 236)
13
#06: Concurrency: ManagedExecutor
User threads in Java EE applications
Support simple and advance concurrency design
patterns
Extend Concurrency Utilities API from Java SE (JSR
166y)
java.util.concurrent package
14
#06: Concurrency: ManagedExecutor
@Resource

ManagedExecutorService executor;

!


ManagedExecutorService executor = 

(ManagedExecutorService) ctx

.lookup("java:comp/DefaultManagedExecutorService");!
Default ManagedExectuor
15
#06: Concurrency: ManagedExecutor
<web-app … version="3.1">!
<resource-env-ref>!
<resource-env-ref-name>!
concurrent/myExecutor!
</resource-env-ref-name>!
<resource-env-ref-type>!
javax.enterprise.concurrent.ManagedExecutorService!
</resource-env-ref-type>!
</resource-env-ref>!
</web-app>!
Specify in web.xml
16
#07: Concurrency: ManagedScheduledExecutor
Managed version of ScheduledExecutorService!
Submit delayed or periodic tasks
@Resource

ManagedScheduledExecutorService executor;!
17
#07: Concurrency: ManagedScheduledExecutor
InitialContext ctx = new InitialContext(); 



ManagedScheduledExecutorService executor =
(ManagedScheduledExecutorService)ctx.lookup(

"java:comp/DefaultManagedScheduledExecutorService");

!
Can be defined in web.xml as well
Access using JNDI
18
#07: Concurrency: ManagedScheduledExecutor
executor.schedule(new MyCallableTask(), 5,
TimeUnit.SECONDS);!
executor.scheduleAtFixedRate(new MyRunnableTask(), 2, 3,
TimeUnit.SECONDS);!
executor.scheduleWithFixedDelay(new MyRunnableTask(), 2, 3,
TimeUnit.SECONDS);!
19
#08: Concurrency: ManagedThreadFactory
Extends ThreadFactory
@Resource(name = "DefaultManagedThreadFactory")

ManagedThreadFactory factory;
ManagedThreadFactory factory = (ManagedThreadFactory)
ctx.lookup("java:comp/DefaultManagedThreadFactory");

20
#08: Concurrency: ManagedThreadFactory
Thread thread = factory.newThread(new
MyTask());
((ManageableThread)thread).isShutdown();

21
#09: Concurrency: DynamicProxy
Create dynamic proxy objects, adds contextual
information available for applications running in
Java EE environment
Classloading, JNDI, Security, …
22
#09: Concurrency: DynamicProxy
@Resource

ContextService service;





Runnable proxy = service.createContextualProxy(new
MyRunnable(), Runnable.class);





Future f = executor.submit(proxy);!
23
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
JPA 2.1 (JSR 338)
24
#10: JPA: Schema Generation
Standardized database schema generation
<persistence ... version="2.1">!
<persistence-unit ...>!
<properties>!
<property

name="javax.persistence.schema-generation.scripts.action”!
value="drop-and-create"/>!
<property

name="javax.persistence.schema-generation.scripts.create-target"
value="create.sql"/>!
<property name="javax.persistence.sql-load-script-source" !
value="insert.sql"/>!
</properties>!
</persistence-unit>!
25
#11: JPA: @Index
Defines additional indexes in schema generation
@Entity!
@Table(indexes = {!
@Index(columnList = "ISBN"),!
@Index(columnList = "NBOFPAGE")!
})!
public class Book {!
!
@Id @GeneratedValue!
private Long id;!
private String isbn;!
private Integer nbOfPage;!
...!
}!
26
#12: JPA: Unsynchronized PC
Persistence context is not enlisted in any tx unless explicitly
joined
@PersistenceContext(synchronization =!
SynchronizationType.UNSYNCHRONIZED)!
private EntityManager em;!
...!
!
em.persist(book);!
!
...!
em.joinTransaction();!
!
27
#13: JPA: Stored Procedure
Calling a stored procedure
@Entity!
@NamedStoredProcedureQuery(name = "archiveOldBooks", !
procedureName = "sp_archive_books",!
parameters = {!
@StoredProcedureParameter(name = ”date", mode = IN, !
type = Date.class),!
@StoredProcedureParameter(name = "warehouse", mode = IN,
type = String.class)!
})!
public class Book {...}!
28
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
JTA 1.2 (JSR 907)
29
#14: JTA: @Transactional
Transaction management on Managed Beans as CDI
interceptor binding
@Path("book")!
@Transactional(value = Transactional.TxType.REQUIRED,!
rollbackOn = {SQLException.class,
JMSException.class},!
dontRollbackOn = SQLWarning.class)!
public class BookRestService {!
!
@PersistenceContext!
private EntityManager em;!
!
@POST!
@Consumes(MediaType.APPLICATION_XML)!
public Response createBook(Book book) {...}!
}!
30
#15: JTA: @TransactionScoped
CDI scope whose lifecycle is scoped to the currently active JTA
transaction
@TransactionScoped!
public class BookBean {...}!
!
@WebServlet!
public class TxServlet extends HttpServlet {!
@Inject UserTransaction tx;!
@Inject BookBean b1;!
@Inject BookBean b2;!
!
protected void processRequest(...) {!
tx.begin();!
s_out.println(b1.getReference());!
s_out.println(b2.getReference());!
tx.commit();!
}!
}!
31
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
EJB 3.2 (JSR 345)
32
#16: EJB: Disable passivation of stateful
@Stateful(passivationCapable = false)!
public class ShoppingCart {!
...!
}!
In some cases increases performance, scalability and
robustness
33
#17: EJB-Lite: Async + Non-persistent timer
@Stateless!
public class OrderEJB {!
!
@Asynchronous!
public void sendEmail (Order order) {!
// Very Long task!
}!
!
@Schedule(hour="2", persistent=false)!
public void createDailyReport() {!
// ...!
}!
}!
Extended the EJB Lite to include local asynchronous invocations
and non-persistent EJB Timer Service
34
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
JMS 2.0 (JSR 343)
35
#18: JMS: JMSContext API
New simplified API to produce and consume messages
@Inject JMSContext ctx;!
!
ctx.createProducer().send(queue, "Text message sent");!
!
ctx.createConsumer(queue).receiveBody(String.class);!
!
ctx.createProducer()!
.setPriority(2)!
.setTimeToLive(1000)!
.setDeliveryMode(DeliveryMode.NON_PERSISTENT)!
.send(queue, message);!
36
#19: JMS: Autocloseable
Several JMS interfaces implement Autocloseable
try (JMSContext ctx = connectionFactory.createContext()) {!
ctx.createProducer().send(queue, "Text message sent");!
}!
!
...!
!
try (JMSContext ctx = connectionFactory.createContext()) {!
while (true) {!
String s =
ctx.createConsumer(queue).receiveBody(String.class);!
}!
}!
37
#20: JMS: JMSConnectionFactoryDefinition
@Stateless!
@JMSConnectionFactoryDefinition(!
name = "java:app/jms/MyConnectionFactory",!
interfaceName =
"javax.jms.TopicConnectionFactory")!
!
!
!
public class ExpensiveOrderEJB {...}!
A JMS ConnectionFactory can be defined using an annotation
on a container-managed class
38
#21: JMS: JMSDestinationDefinition
A JMS queue or topic can be defined using an annotation
@Stateless!
@JMSConnectionFactoryDefinition(!
name = "java:app/jms/MyConnectionFactory",!
interfaceName =
"javax.jms.TopicConnectionFactory")!
@JMSDestinationDefinition(!
name = "java:app/jms/MyTopic",!
interfaceName = "javax.jms.Topic")!
public class ExpensiveOrderEJB {...}!
39
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
Servlet 3.1 (JSR 340)
40
#22: Servlet: Non-blocking I/O
public class TestServlet extends HttpServlet

protected void doGet(HttpServletRequest request,

HttpServletResponse response) 

throws IOException, ServletException {

ServletInputStream input = request.getInputStream();

byte[] b = new byte[1024];

int len = -1;

while ((len = input.read(b)) != -1) {

. . .

}

}

}!
41
#22: Servlet: Non-blocking I/O
ServletInputStream!
public void setReadListener(ReadListener listener);!
public boolean isFinished();!
public boolean isReady();!
ServletOutputStream!
public setWriteListener(WriteListener listener);!
public boolean canWrite();!
New methods to existing interfaces
42
#22: Servlet: Non-blocking I/O
public interface ReadListener extends EventListener {

public void onDataAvailable();

pubic void onAllDataRead();

public void onError();

}!
public interface WriteListener extends EventListener {

public void onWritePossible();

public void onError();

}!
New interfaces
43
#22: Servlet: Non-blocking I/O
AsyncContext context = request.startAsync();

ServletInputStream input = request.getInputStream();

input.setReadListener(

new MyReadListener(input, context)); !
Only for Asynchronous Servlets
44
#23: Servlet: Protocol Upgrade
<T extends HttpUpgradeHandler> T
HttpServletRequest.upgrade(Class<T> class) throws
IOException;





!
HttpUpgradeHandler!
init(WebConnection wc);!
destroy();!
45
#23: Servlet: Protocol Upgrade
public interface WebConnection {

ServletInputStream getInputStream();

ServletOutputStream getOutputStream();

}!
46
#24: Servlet: Improved Security
<web-app . . . version="3.1"> 

<web-resource-collection>

<url-pattern>/account/*</url-pattern> 

<http-method>GET</http-method>

</web-resource-collection>

<auth-contraint>

. . .

</auth-contraint>

</web-app> !
!
Deny an HTTP method request for an uncovered HTTP method
47
#24: Servlet: Improved Security
<web-app . . . version="3.1"> 

<deny-uncovered-http-methods/>

<web-resource-collection>

<url-pattern>/account/*</url-pattern> 

<http-method>GET</http-method>

</web-resource-collection>

<auth-contraint>

. . .

</auth-contraint> 

</web-app> !
!
Deny an HTTP method request for an uncovered HTTP method
48
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
Web Socket 1.0 (JSR 356)
49
#25: WebSocket: Annotated server endpoint
Enables full-duplex bi-directional communication over
single TCP connection
@javax.websocket.server.ServerEndpoint("/chat")

public class ChatServer {



@OnMessage

public String chat(String name, Session session) {

for (Session peer : client.getOpenSessions()) {!
peer.getBasicRemote().sendObject(message);!
}

}

}!
50
#26: WebSocket: Lifecycle callbacks
@javax.websocket.OnOpen

public void open(Session s) { . . . }



@javax.websocket.OnClose

public void close(CloseReason c) { . . . }



@javax.websocket.OnError

public void error(Throwable t) { . . . }!
51
#27: WebSocket: Annotated client endpoint
@javax.websocket.ClientEndpoint

public class MyClient {

@javax.websocket.OnOpen

public void open(Session session) { … }



// Lifecycle callbacks

}!
52
#27: WebSocket: Annotated client endpoint
ContainerProvider

.getWebSocketContainer()

.connectToServer(

MyClient.class, 

URI.create("ws://. . ."));!
53
#28: WebSocket: Programmatic endpoints
public class ChatServer extends Endpoint {

@Override

public void onOpen(Session s, EndpointConfig ec) {

s.addMessageHandler(new MessageHandler.Whole<String>() {
public void onMessage(String text) { . . . }

}

}



@Override

public void onClose(Session s, CloseReason cr) { . . . }



//. . . 

}!
54
#28: WebSocket: Programmatic endpoints
public class MyApplicationConfig implements
ServerApplicationConfig {

public Set<ServerEndpointConfig>
getEndpointConfigs(…) { 

ServerEndpointConfig.Builder

.create(MyEndpoint.class, "/websocket”)

.configurator(new MyConfig())

.build()

}

}!
55
#28: WebSocket: Programmatic endpoints
public class MyConfig extends
ServerEndpointConfig.Configurator {



public <T> T getEndpointInstance(. . .) { . . . }



public void modifyHandshake(. . .) { . . . }



. . .

}!
56
#29: WebSocket: Encoder and Decoder
@javax.websocket.server.ServerEndpoint(

value="/chat",

decoders="MyDecoder.class",

encoders="MyEncoder.class")

public class ChatServer {



@OnMessage

public String chat(ChatMessage name, Session session) {

. . . 

}

}!
57
#29: WebSocket: Encoder and Decoder
public class MyDecoder implements Decoder.Text<ChatMessage> {

public ChatMessage decode(String s) {

// . . .

}



public boolean willDecode(String string) {

// . . .

}



//. . .

}



!
58
#29: WebSocket: Encoder and Decoder
public class MyEncoder implements Encoder.Text<ChatMessage> {



public String encode(ChatMessage chatMessage) {

// . . .

}

!
// . . .

}!
59
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
Expression Language 3.0 (JSR 341)
60
#30: Expression Langauge: ELProcessor
Use EL in a stand-alone environment
Evaluate EL expressions
Defining a static method as an EL function
Defining an object instance as an EL name
ELProcessor elp = new ELProcessor();

elp.defineBean("employee", new
Employee("Charlie Brown"));

String name = elp.eval("employee.name");!
61
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
JSF 2.2 (JSR 344)
62
#31: JSF: Faces Flow
./src/main/webapp/flow1

/flow1.xhtml

/flow1a.xhtml

/flow1b.xhtml

./src/main/webapp/flow2

/flow2-flow.xml

/flow2.xhtml

/flow2a.xhtml

/flow2b.xhtml

/index.xhtml!
Package reusable flows in JAR
63
#31: JSF: Faces Flow
@Named

@FlowScoped("flow1")

public class Flow1Bean implements Serializable {

}!
!
@Produces @FlowDefinition

public Flow defineFlow(@FlowBuilderParameter FlowBuilder
fb) {

String flowId = "flow1";

//. . .

return fb.getFlow();

}!
Package reusable flows in JAR
64
#31: JSF: Faces Flow
#{flowScope}: Local flow storage
#{facesContext.application.flowHandler.currentFlow}: Returns true if within
a flow
Package reusable flows in JAR
65
#32: JSF: Resource Library Contract
index-blue.xhtml

index-red.xhtml

WEB-INF/lib/contracts-library-1.0-SNAPSHOT.jar

/META-INF/contracts/blue

/style.css

/javax.faces.contract.xml

/template.xhtml

/META-INF/contracts/red

/style.css

/javax.faces.contract.xml

/template.xhtml!
Apply templates in a reusable and interchangeable manner
66
#32: JSF: Resource Library Contract
<f:view contracts=”red”>

<ui:composition template="/template.xhtml">

. . .

</ui:composition>

</f:view>

!
Apply templates in a reusable and interchangeable manner
67
#33: JSF: Pass-through Attributes
<h:inputText type="email" value="#{user.email}"/> 

!
<input type="text" name="j_idt6:j_idt10"/>!
HTML5-Friendly Markup
<h:inputText p:type="email" value="#{user.email}"/> 



<input type="email" name="j_idt6:j_idt10"/>!
!
68
#34: JSF: File Upload Component
<h:form enctype="multipart/form-data">

<h:inputFile value="#{fileUploadBean.file}"/><br/>

<h:commandButton value="Upload"/><p/>

</h:form> !
@Named @RequestScoped 

public class FileUploadBean {

private Part file;



//getter and setter

} !
69
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
JAX-RS 2.0 (JSR 339)
70
#35: JAX-RS: Client API
Client client = ClientBuilder.newClient();!
WebTarget target = client.target("http://www.foo.com/
book");!
Invocation invocation =
target.request(TEXT_PLAIN).buildGet();!
Response response = invocation.invoke();!
!
Response response = ClientBuilder.newClient()!
.target("http://www.foo.com/book")!
.request(MediaType.TEXT_PLAIN)!
.get();!
!
String body = ClientBuilder.newClient()!
.target("http://www.foo.com/book")!
.request()!
.get(String.class);!
New API to consume rest services
71
#36: JAX-RS: Async Client
Future<String> future = ClientBuilder.newClient()!
.target("http://www.foo.com/book")!
.request()!
.async()!
.get(String.class);!
!
try {!
String body = future.get(1, TimeUnit.MINUTES);!
} catch (InterruptedException | ExecutionException e) {
. . .

}!
The client API also supports asynchronous invocation
72
#37: JAX-RS: Async Server
@Path("/async")!
public class AsyncResource {!
!
@GET!
public void asyncGet(@Suspended AsyncResponse
asyncResp) {!
!
new Thread(new Runnable() {!
!
public void run() {!
String result = veryExpensiveOperation();!
asyncResp.resume(result);!
}!
}).start();!
}}!
Asynchronous request processing on the server
73
#38: JAX-RS: Message Filter
Filters on client side
ClientRequestFilter!
ClientResponseFilter!
Filters on server side
ContainerRequestFilter!
ContainerResponseFilter!
Used to process incoming and outgoing request or response
headers
74
#38: JAX-RS: Message Filter
public class LogginFilter implements ClientRequestFilter {!
!
public void filter(ClientRequestContext ctx) throws
IOException {!
System.out.println(ctx.getMethod());!
System.out.println(ctx.getUri());!
}!
}!
Used to process incoming and outgoing request or response
headers
75
#39: JAX-RS: Entity Interceptors
Intercepts inbound entity streams (reads from the “wire”)
ReaderInterceptor!
Intercepts outbound entity streams (writes to the “wire”)
WriterInterceptor!
Marshalling and unmarshalling HTTP message bodies
76
#39: JAX-RS: Entity Interceptors
public class GZipInterceptor implements
WriterInterceptor {!
!
public void aroundWriteTo(WriterInterceptorContext
ctx){!
OutputStream os = ctx.getOutputStream();!
ctx.setOutputStream(new GZIPOutputStream(os));!
ctx.proceed();!
}!
}!
Marshalling and unmarshalling HTTP message bodies
77
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
JSON-P 1.0 (JSR 353)
78
#40: JSON-P: JSON Builder
JsonObject value = Json.createObjectBuilder()!
.add("id", "1234")!
.add("date", "19/09/2012")!
.add("total_amount", "93.48")!
.add("customer", Json.createObjectBuilder()!
.add("first_name", "James")!
.add("last_name", "Rorrison")!
.add("email", "j.rorri@me.com")!
.add("phoneNumber", "+44 12341234")!
)!
.build();!
Creates an object model (or an array) in memory by adding
elements
79
#41: JSON-P: JsonParser
JsonParser parser = Json.createParser(new
FileReader(“order.json"));!
while (parser.hasNext()) {!
JsonParser.Event event = parser.next();!
!
if (event.equals(JsonParser.Event.KEY_NAME) && !
parser.getString().matches("email")) {!
parser.next();!
email = parser.getString();!
}!
}!
Event-based parser that can read JSON data from a stream
80
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
Batch 1.0 (JSR 352)
81
#42: Batch: Chunk-style Processing
Item-oriented Processing Style (primary)
82
#42: Batch: Chunk-style Processing
<step id=”sendStatements”>!
<chunk item-count=“3”>

<reader ref=”accountReader”/>!
<processor ref=”accountProcessor”/>

<writer ref=”emailWriter”/>!
</step>!
…implements ItemReader {

public Object readItem() {

// read account using JP
}!
!
…implements ItemProcessor {!
public Object processItems(Object
account) {

// read Account, return Statement!
}!
!
…implements ItemWriter {!
public void writeItems(List accounts) {

// use JavaMail to send email!
}!
!
83
#43: Batch: Batchlet-style Processing
Task-oriented processing style
<step id=”transferFile”>!
<batchlet ref=“MyFileTransfer” />!
</step>!
…implements Batchlet {!
@Override

public void process() {

// Transfer file!
}!
!
84
#44: Batch: Job/Step/Chunk Listeners
<job id="myJob" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
version="1.0”>

<listeners>

<listener ref="myJobListener"/>

</listeners>

<step id="myStep" >

<listeners>

<listener ref="myStepListener"/>

<listener ref="myChunkListener"/>

<listener ref="myItemReadListener"/>

<listener ref="myItemProcessorListener"/>

<listener ref="myItemWriteListener"/>

</listeners>

<chunk item-count="3”>. . .</chunk>

</step>

</job>!
!
85
#44: Batch: Job/Step/Chunk Listeners
Interface Abstract Classes
JobListener! AbstractJobListener!
StepListener! AbstractStepListener!
ChunkListener! AbstractChunkListener!
ItemRead/Write/
ProcessListener!
AbstractItemRead/Write/
ProcessListener!
SkipRead/Write/
ProcessListener!
AbstractSkipRead/Write/
ProcessListener!
RetryRead/Write/
ProcessListener!
AbstractRetryRead/Write/
ProcessListener!
86
#44: Batch: Job/Step/Chunk Listeners
@Named

public class MyJobListener extends AbstractJobListener {



@Override

public void beforeJob() throws Exception { . . . }



@Override

public void afterJob() throws Exception { . . . }

}!
87
#45: Batch: Partition
<step>

<chunk item-count="3">

<reader ref="myItemReader">

<properties>

<property name="start"
value="#{partitionPlan['start']}"/>

<property name="end" value="#{partitionPlan['end']}"/>

</properties> 

</reader>

. . .

</chunk>!
88
#45: Batch: Partition
<partition>

<plan partitions="2">

<properties partition="0">

<property name="start" value="1"/>

<property name="end" value="10"/>

</properties>

<properties partition="1">

<property name="start" value="11"/>

<property name="end" value="20"/>

</properties>

</plan>

</partition>

</step>!
89
#46: Batch: Creating Workflows
<flow id="flow1" next="step3">

<step id="step1" next="step2"> . . . </step>

<step id="step2"> . . . </step>

</flow>

<step id="step3"> . . . </step>!
Flow: Elements that execute together as a unit
90
#46: Batch: Creating Workflows
<split id="split1" next=" . . . ">

<flow id="flow1”>

<step id="step1”> . . . </step>

</flow>

<flow id="flow2”>

<step id="step2”> . . . </step>

</flow>

</split>!
Split: Concurrent execution of flows
91
#46: Batch: Creating Workflows
<step id="step1" next="decider1">. . .</step>

<decision id="decider1" ref="myDecider"> 

<next on="DATA_LOADED" to="step2"/> 

<end on="NOT_LOADED"/> </decision>

<step id="step2">. . .</step> !
!
Decision: Customized way of sequencing between steps, flows,
splits
@Named

public class MyDecider implements Decider {

@Override

public String decide(StepExecution[] ses) throws
Exception {

. . .

return "DATA_LOADED"; // or "NOT_LOADED"!
} !
}!
92
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
JavaMail 1.5 (JSR 919)
93
#47: JavaMail
@MailSessionDefinition(name = "java:comp/myMailSession",

properties = {

"mail.smtp.host=smtp.gmail.com",

"mail.smtp.ssl.enable=true",

"mail.smtp.auth=true",

"mail.transport.protocol=smtp",

"mail.debug=true"

})





@Resource(lookup = "java:comp/myMailSession")

Session session;!
94
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
JCA 1.7 (JSR 322)
95
#48: Java Connector Architecture
@ConnectionDefinition(

connection="MyConnection.class",

connectionImpl="MyConnectionImpl.class",

connectionFactory="MyConnectionFactory.class",

connectionFactoryImpl="MyConnectionFactoryImpl.class"

)

!
@AdministeredObjectDefinition(

className="MyQueueImpl.class",

name="java:comp/MyQueue",

resourceAdapter="myAdapter",

)!
96
JAX-RS
2.0
JSON-P
1.0Web Socket
1.0
Servlet 3.1
JSF 2.2EL 3.0
JSP
JSTL
BeanValidation1.1
Interceptors1.2
CDI1.1
Concurrency1.0
JPA 2.1
JTA 1.2 EJB 3.2 JMS 2.0
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
Java EE 7 (JSR 342)
97
#49: Default Resources
JNDI name: java:comp/DefaultDataSource
Default Data Source
@Resource(lookup="java:comp/DefaultDataSource")

DataSource myDS;

!
@Resource

DataSource myDS; !
98
#49: Default Resources
JNDI name: java:comp/DefaultJMSConnectionFactory



@Resource(lookup="java:comp/DefaultJMSConnectionFactory”)

ConnectionFactory myCF;
@Resource

ConnectionFactory myCF;!
Default JMS Connection Factory
99
#49: Default Resources
JNDI names
java:comp/DefaultManagedExecutorService!
java:comp/DefaultManagedScheduledExecutorService!
java:comp/DefaultManagedThreadFactory!
java:comp/DefaultContextService!
Default Concurrency Utilities Objects
100
#50: Buy our books!
101
References
github.com/javaee-samples/javaee7-samples
github.com/javaee-samples/javaee7-hol
102

More Related Content

PDF
50 features of Java EE 7 in 50 minutes at JavaZone 2014
PDF
50 New Features of Java EE 7 in 50 minutes @ Devoxx France 2014
PPTX
Getting Started with Java EE 7
PPTX
Java EE 8
PPTX
Batching and Java EE (jdk.io)
PDF
Play Framework and Activator
PPTX
Java EE 8 Update
PPTX
Node.js Development with Apache NetBeans
50 features of Java EE 7 in 50 minutes at JavaZone 2014
50 New Features of Java EE 7 in 50 minutes @ Devoxx France 2014
Getting Started with Java EE 7
Java EE 8
Batching and Java EE (jdk.io)
Play Framework and Activator
Java EE 8 Update
Node.js Development with Apache NetBeans

What's hot (19)

PDF
Web application development using Play Framework (with Java)
PPTX
Top 50 java ee 7 best practices [con5669]
PPTX
Why Play Framework is fast
PPTX
Preparing for java 9 modules upload
PPTX
Faster Java EE Builds with Gradle
PDF
Boost Development With Java EE7 On EAP7 (Demitris Andreadis)
PDF
Jolokia - JMX on Capsaicin (Devoxx 2011)
PPTX
Faster Java EE Builds with Gradle
PDF
Java EE 6, Eclipse @ EclipseCon
PPTX
Why jakarta ee matters (ConFoo 2021)
PDF
Play framework productivity formula
PPTX
Play! Framework for JavaEE Developers
PPTX
Faster java ee builds with gradle [con4921]
PPTX
Exploring Java Heap Dumps (Oracle Code One 2018)
PDF
Spicing up JMX with Jolokia (Devoxx 2014)
PDF
Vert.x - Tehran JUG meeting Aug-2014 - Saeed Zarinfam
PDF
Tools Coverage for the Java EE Platform @ Silicon Valley Code Camp 2010
PDF
Java(ee) mongo db applications in the cloud
PDF
Using Play Framework 2 in production
Web application development using Play Framework (with Java)
Top 50 java ee 7 best practices [con5669]
Why Play Framework is fast
Preparing for java 9 modules upload
Faster Java EE Builds with Gradle
Boost Development With Java EE7 On EAP7 (Demitris Andreadis)
Jolokia - JMX on Capsaicin (Devoxx 2011)
Faster Java EE Builds with Gradle
Java EE 6, Eclipse @ EclipseCon
Why jakarta ee matters (ConFoo 2021)
Play framework productivity formula
Play! Framework for JavaEE Developers
Faster java ee builds with gradle [con4921]
Exploring Java Heap Dumps (Oracle Code One 2018)
Spicing up JMX with Jolokia (Devoxx 2014)
Vert.x - Tehran JUG meeting Aug-2014 - Saeed Zarinfam
Tools Coverage for the Java EE Platform @ Silicon Valley Code Camp 2010
Java(ee) mongo db applications in the cloud
Using Play Framework 2 in production
Ad

Viewers also liked (14)

PDF
How to run your first marathon ? JavaOne 2014 Ignite
PDF
NoSQL - Vital Open Source Ingredient for Modern Success
PDF
Java EE 7 Soup to Nuts at JavaOne 2014
PDF
Introduce Programming to Kids at Geecon 2014
PDF
Teaching kids how to program
PDF
Deploying Web Applications with WildFly 8
PDF
Thanks Managers!
PDF
Migrate your traditional VM-based Clusters to Containers
PDF
Nuts and Bolts of WebSocket Devoxx 2014
PDF
Lessons Learned from Real-World Deployments of Java EE 7 at JavaOne 2014
PDF
Docker, Kubernetes, and Mesos recipes for Java developers
PDF
Java EE and NoSQL using JBoss EAP 7 and OpenShift
PDF
Container Landscape in 2017
PDF
Package your Java EE Application using Docker and Kubernetes
How to run your first marathon ? JavaOne 2014 Ignite
NoSQL - Vital Open Source Ingredient for Modern Success
Java EE 7 Soup to Nuts at JavaOne 2014
Introduce Programming to Kids at Geecon 2014
Teaching kids how to program
Deploying Web Applications with WildFly 8
Thanks Managers!
Migrate your traditional VM-based Clusters to Containers
Nuts and Bolts of WebSocket Devoxx 2014
Lessons Learned from Real-World Deployments of Java EE 7 at JavaOne 2014
Docker, Kubernetes, and Mesos recipes for Java developers
Java EE and NoSQL using JBoss EAP 7 and OpenShift
Container Landscape in 2017
Package your Java EE Application using Docker and Kubernetes
Ad

Similar to 50 features of Java EE 7 in 50 minutes at Geecon 2014 (20)

PDF
50 New Features of Java EE 7 in 50 minutes
PDF
5050 dev nation
PDF
Fifty New Features of Java EE 7 in Fifty Minutes
PDF
Fifty Features of Java EE 7 in 50 Minutes
PDF
OTN Tour 2013: What's new in java EE 7
PDF
InterConnect 2016 Java EE 7 Overview (PEJ-5296)
PDF
Java EE 7, what's in it for me?
PDF
50 new features of Java EE 7 in 50 minutes
PDF
AAI-1713 Introduction to Java EE 7
PDF
AAI 1713-Introduction to Java EE 7
PPTX
Java EE 7 - New Features and the WebSocket API
PDF
Haj 4328-java ee 7 overview
PDF
Contextual Dependency Injection for Apachecon 2010
PPT
Java EE7 in action
PDF
A Hitchhiker's Guide to Cloud Native Java EE
PDF
A Hitchhiker's Guide to Cloud Native Java EE
PDF
Java EE7 Demystified
PDF
Presente e Futuro: Java EE.next()
PDF
Vaadin with Java EE 7
PPTX
Java EE 6
50 New Features of Java EE 7 in 50 minutes
5050 dev nation
Fifty New Features of Java EE 7 in Fifty Minutes
Fifty Features of Java EE 7 in 50 Minutes
OTN Tour 2013: What's new in java EE 7
InterConnect 2016 Java EE 7 Overview (PEJ-5296)
Java EE 7, what's in it for me?
50 new features of Java EE 7 in 50 minutes
AAI-1713 Introduction to Java EE 7
AAI 1713-Introduction to Java EE 7
Java EE 7 - New Features and the WebSocket API
Haj 4328-java ee 7 overview
Contextual Dependency Injection for Apachecon 2010
Java EE7 in action
A Hitchhiker's Guide to Cloud Native Java EE
A Hitchhiker's Guide to Cloud Native Java EE
Java EE7 Demystified
Presente e Futuro: Java EE.next()
Vaadin with Java EE 7
Java EE 6

More from Arun Gupta (15)

PDF
5 Skills To Force Multiply Technical Talents.pdf
PPTX
Machine Learning using Kubernetes - AI Conclave 2019
PDF
Machine Learning using Kubeflow and Kubernetes
PPTX
Secure and Fast microVM for Serverless Computing using Firecracker
PPTX
Building Java in the Open - j.Day at OSCON 2019
PPTX
Why Amazon Cares about Open Source
PDF
Machine learning using Kubernetes
PDF
Building Cloud Native Applications
PDF
Chaos Engineering with Kubernetes
PDF
How to be a mentor to bring more girls to STEAM
PDF
Java in a World of Containers - DockerCon 2018
PPTX
The Serverless Tidal Wave - SwampUP 2018 Keynote
PDF
Introduction to Amazon EKS - KubeCon 2018
PDF
Mastering Kubernetes on AWS - Tel Aviv Summit
PDF
Top 10 Technology Trends Changing Developer's Landscape
5 Skills To Force Multiply Technical Talents.pdf
Machine Learning using Kubernetes - AI Conclave 2019
Machine Learning using Kubeflow and Kubernetes
Secure and Fast microVM for Serverless Computing using Firecracker
Building Java in the Open - j.Day at OSCON 2019
Why Amazon Cares about Open Source
Machine learning using Kubernetes
Building Cloud Native Applications
Chaos Engineering with Kubernetes
How to be a mentor to bring more girls to STEAM
Java in a World of Containers - DockerCon 2018
The Serverless Tidal Wave - SwampUP 2018 Keynote
Introduction to Amazon EKS - KubeCon 2018
Mastering Kubernetes on AWS - Tel Aviv Summit
Top 10 Technology Trends Changing Developer's Landscape

Recently uploaded (20)

PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
cuic standard and advanced reporting.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
KodekX | Application Modernization Development
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Encapsulation theory and applications.pdf
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
Big Data Technologies - Introduction.pptx
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Electronic commerce courselecture one. Pdf
PPT
Teaching material agriculture food technology
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
Cloud computing and distributed systems.
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
cuic standard and advanced reporting.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
KodekX | Application Modernization Development
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Encapsulation theory and applications.pdf
Understanding_Digital_Forensics_Presentation.pptx
Chapter 3 Spatial Domain Image Processing.pdf
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Unlocking AI with Model Context Protocol (MCP)
Advanced methodologies resolving dimensionality complications for autism neur...
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
NewMind AI Weekly Chronicles - August'25 Week I
Big Data Technologies - Introduction.pptx
Encapsulation_ Review paper, used for researhc scholars
Mobile App Security Testing_ A Comprehensive Guide.pdf
Electronic commerce courselecture one. Pdf
Teaching material agriculture food technology
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Cloud computing and distributed systems.

50 features of Java EE 7 in 50 minutes at Geecon 2014

  • 1. 1 50 features of Java EE 7 in 50 minutes Arun Gupta, @arungupta
  • 3. 3 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5
  • 4. 4 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 CDI 1.1 (JSR 346)
  • 5. 5 #01: CDI: Default enabling Finer scanning control Possible values: all, annotated, none! Annotated behaves like in Java EE 6 (default)! ! <beans ... version="1.1" bean-discovery-mode="all">! <alternatives>! <class>org.agoncal.book.MockGenerator</class>! </alternatives>! </beans>!
  • 6. 6 #02: CDI: @Vetoed Veto the processing of the class or package @Vetoed! public class NonProcessedBean {
 ...! }! ! package-info.java @Vetoed! package com.non.processed.package;!
  • 7. 7 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 Bean Validation 1.1 (JSR 349)
  • 8. 8 #03: Bean Validation: Method validation public class CardValidator {! ! public CardValidator(@NotNull Algorithm algorithm) {! this.algorithm = algorithm;! }! ! @AssertTrue! public Boolean validate(@NotNull CreditCard creditCard) {! return algorithm.validate(creditCard.getNumber());! }! }! Pre/post conditions on method and constructors
  • 9. 9 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 Interceptors 1.2 (JSR 318)
  • 10. 10 #04: Interceptors: AroundConstruct Interceptor associated with a constructor public class LoggingInterceptor {! ! @AroundConstruct! private void init(InvocationContext ic) 
 throws Exception{! logger.fine("Entering constructor");! ic.proceed();! logger.fine("Exiting constructor");! }! ! @AroundInvoke! public Object logMethod(InvocationContext ic) ... { // ...! }! }!
  • 11. 11 #05: Interceptors: @Priority Prioritizing interceptor bindings PLATFORM_BEFORE (0), LIBRARY_BEFORE (1000), APPLICATION (2000), LIBRARY_AFTER (3000), PLATFORM_AFTER (4000)! @Interceptor! @Loggable! @Priority(Interceptor.Priority.LIBRARY_BEFORE + 10)! public class LoggingInterceptor {! ! @AroundInvoke! ...! }!
  • 12. 12 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 Concurrency Utilities 1.0 (JSR 236)
  • 13. 13 #06: Concurrency: ManagedExecutor User threads in Java EE applications Support simple and advance concurrency design patterns Extend Concurrency Utilities API from Java SE (JSR 166y) java.util.concurrent package
  • 14. 14 #06: Concurrency: ManagedExecutor @Resource
 ManagedExecutorService executor;
 ! 
 ManagedExecutorService executor = 
 (ManagedExecutorService) ctx
 .lookup("java:comp/DefaultManagedExecutorService");! Default ManagedExectuor
  • 15. 15 #06: Concurrency: ManagedExecutor <web-app … version="3.1">! <resource-env-ref>! <resource-env-ref-name>! concurrent/myExecutor! </resource-env-ref-name>! <resource-env-ref-type>! javax.enterprise.concurrent.ManagedExecutorService! </resource-env-ref-type>! </resource-env-ref>! </web-app>! Specify in web.xml
  • 16. 16 #07: Concurrency: ManagedScheduledExecutor Managed version of ScheduledExecutorService! Submit delayed or periodic tasks @Resource
 ManagedScheduledExecutorService executor;!
  • 17. 17 #07: Concurrency: ManagedScheduledExecutor InitialContext ctx = new InitialContext(); 
 
 ManagedScheduledExecutorService executor = (ManagedScheduledExecutorService)ctx.lookup(
 "java:comp/DefaultManagedScheduledExecutorService");
 ! Can be defined in web.xml as well Access using JNDI
  • 18. 18 #07: Concurrency: ManagedScheduledExecutor executor.schedule(new MyCallableTask(), 5, TimeUnit.SECONDS);! executor.scheduleAtFixedRate(new MyRunnableTask(), 2, 3, TimeUnit.SECONDS);! executor.scheduleWithFixedDelay(new MyRunnableTask(), 2, 3, TimeUnit.SECONDS);!
  • 19. 19 #08: Concurrency: ManagedThreadFactory Extends ThreadFactory @Resource(name = "DefaultManagedThreadFactory")
 ManagedThreadFactory factory; ManagedThreadFactory factory = (ManagedThreadFactory) ctx.lookup("java:comp/DefaultManagedThreadFactory");

  • 20. 20 #08: Concurrency: ManagedThreadFactory Thread thread = factory.newThread(new MyTask()); ((ManageableThread)thread).isShutdown();

  • 21. 21 #09: Concurrency: DynamicProxy Create dynamic proxy objects, adds contextual information available for applications running in Java EE environment Classloading, JNDI, Security, …
  • 22. 22 #09: Concurrency: DynamicProxy @Resource
 ContextService service;
 
 
 Runnable proxy = service.createContextualProxy(new MyRunnable(), Runnable.class);
 
 
 Future f = executor.submit(proxy);!
  • 23. 23 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 JPA 2.1 (JSR 338)
  • 24. 24 #10: JPA: Schema Generation Standardized database schema generation <persistence ... version="2.1">! <persistence-unit ...>! <properties>! <property
 name="javax.persistence.schema-generation.scripts.action”! value="drop-and-create"/>! <property
 name="javax.persistence.schema-generation.scripts.create-target" value="create.sql"/>! <property name="javax.persistence.sql-load-script-source" ! value="insert.sql"/>! </properties>! </persistence-unit>!
  • 25. 25 #11: JPA: @Index Defines additional indexes in schema generation @Entity! @Table(indexes = {! @Index(columnList = "ISBN"),! @Index(columnList = "NBOFPAGE")! })! public class Book {! ! @Id @GeneratedValue! private Long id;! private String isbn;! private Integer nbOfPage;! ...! }!
  • 26. 26 #12: JPA: Unsynchronized PC Persistence context is not enlisted in any tx unless explicitly joined @PersistenceContext(synchronization =! SynchronizationType.UNSYNCHRONIZED)! private EntityManager em;! ...! ! em.persist(book);! ! ...! em.joinTransaction();! !
  • 27. 27 #13: JPA: Stored Procedure Calling a stored procedure @Entity! @NamedStoredProcedureQuery(name = "archiveOldBooks", ! procedureName = "sp_archive_books",! parameters = {! @StoredProcedureParameter(name = ”date", mode = IN, ! type = Date.class),! @StoredProcedureParameter(name = "warehouse", mode = IN, type = String.class)! })! public class Book {...}!
  • 28. 28 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 JTA 1.2 (JSR 907)
  • 29. 29 #14: JTA: @Transactional Transaction management on Managed Beans as CDI interceptor binding @Path("book")! @Transactional(value = Transactional.TxType.REQUIRED,! rollbackOn = {SQLException.class, JMSException.class},! dontRollbackOn = SQLWarning.class)! public class BookRestService {! ! @PersistenceContext! private EntityManager em;! ! @POST! @Consumes(MediaType.APPLICATION_XML)! public Response createBook(Book book) {...}! }!
  • 30. 30 #15: JTA: @TransactionScoped CDI scope whose lifecycle is scoped to the currently active JTA transaction @TransactionScoped! public class BookBean {...}! ! @WebServlet! public class TxServlet extends HttpServlet {! @Inject UserTransaction tx;! @Inject BookBean b1;! @Inject BookBean b2;! ! protected void processRequest(...) {! tx.begin();! s_out.println(b1.getReference());! s_out.println(b2.getReference());! tx.commit();! }! }!
  • 31. 31 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 EJB 3.2 (JSR 345)
  • 32. 32 #16: EJB: Disable passivation of stateful @Stateful(passivationCapable = false)! public class ShoppingCart {! ...! }! In some cases increases performance, scalability and robustness
  • 33. 33 #17: EJB-Lite: Async + Non-persistent timer @Stateless! public class OrderEJB {! ! @Asynchronous! public void sendEmail (Order order) {! // Very Long task! }! ! @Schedule(hour="2", persistent=false)! public void createDailyReport() {! // ...! }! }! Extended the EJB Lite to include local asynchronous invocations and non-persistent EJB Timer Service
  • 34. 34 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 JMS 2.0 (JSR 343)
  • 35. 35 #18: JMS: JMSContext API New simplified API to produce and consume messages @Inject JMSContext ctx;! ! ctx.createProducer().send(queue, "Text message sent");! ! ctx.createConsumer(queue).receiveBody(String.class);! ! ctx.createProducer()! .setPriority(2)! .setTimeToLive(1000)! .setDeliveryMode(DeliveryMode.NON_PERSISTENT)! .send(queue, message);!
  • 36. 36 #19: JMS: Autocloseable Several JMS interfaces implement Autocloseable try (JMSContext ctx = connectionFactory.createContext()) {! ctx.createProducer().send(queue, "Text message sent");! }! ! ...! ! try (JMSContext ctx = connectionFactory.createContext()) {! while (true) {! String s = ctx.createConsumer(queue).receiveBody(String.class);! }! }!
  • 37. 37 #20: JMS: JMSConnectionFactoryDefinition @Stateless! @JMSConnectionFactoryDefinition(! name = "java:app/jms/MyConnectionFactory",! interfaceName = "javax.jms.TopicConnectionFactory")! ! ! ! public class ExpensiveOrderEJB {...}! A JMS ConnectionFactory can be defined using an annotation on a container-managed class
  • 38. 38 #21: JMS: JMSDestinationDefinition A JMS queue or topic can be defined using an annotation @Stateless! @JMSConnectionFactoryDefinition(! name = "java:app/jms/MyConnectionFactory",! interfaceName = "javax.jms.TopicConnectionFactory")! @JMSDestinationDefinition(! name = "java:app/jms/MyTopic",! interfaceName = "javax.jms.Topic")! public class ExpensiveOrderEJB {...}!
  • 39. 39 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 Servlet 3.1 (JSR 340)
  • 40. 40 #22: Servlet: Non-blocking I/O public class TestServlet extends HttpServlet
 protected void doGet(HttpServletRequest request,
 HttpServletResponse response) 
 throws IOException, ServletException {
 ServletInputStream input = request.getInputStream();
 byte[] b = new byte[1024];
 int len = -1;
 while ((len = input.read(b)) != -1) {
 . . .
 }
 }
 }!
  • 41. 41 #22: Servlet: Non-blocking I/O ServletInputStream! public void setReadListener(ReadListener listener);! public boolean isFinished();! public boolean isReady();! ServletOutputStream! public setWriteListener(WriteListener listener);! public boolean canWrite();! New methods to existing interfaces
  • 42. 42 #22: Servlet: Non-blocking I/O public interface ReadListener extends EventListener {
 public void onDataAvailable();
 pubic void onAllDataRead();
 public void onError();
 }! public interface WriteListener extends EventListener {
 public void onWritePossible();
 public void onError();
 }! New interfaces
  • 43. 43 #22: Servlet: Non-blocking I/O AsyncContext context = request.startAsync();
 ServletInputStream input = request.getInputStream();
 input.setReadListener(
 new MyReadListener(input, context)); ! Only for Asynchronous Servlets
  • 44. 44 #23: Servlet: Protocol Upgrade <T extends HttpUpgradeHandler> T HttpServletRequest.upgrade(Class<T> class) throws IOException;
 
 
 ! HttpUpgradeHandler! init(WebConnection wc);! destroy();!
  • 45. 45 #23: Servlet: Protocol Upgrade public interface WebConnection {
 ServletInputStream getInputStream();
 ServletOutputStream getOutputStream();
 }!
  • 46. 46 #24: Servlet: Improved Security <web-app . . . version="3.1"> 
 <web-resource-collection>
 <url-pattern>/account/*</url-pattern> 
 <http-method>GET</http-method>
 </web-resource-collection>
 <auth-contraint>
 . . .
 </auth-contraint>
 </web-app> ! ! Deny an HTTP method request for an uncovered HTTP method
  • 47. 47 #24: Servlet: Improved Security <web-app . . . version="3.1"> 
 <deny-uncovered-http-methods/>
 <web-resource-collection>
 <url-pattern>/account/*</url-pattern> 
 <http-method>GET</http-method>
 </web-resource-collection>
 <auth-contraint>
 . . .
 </auth-contraint> 
 </web-app> ! ! Deny an HTTP method request for an uncovered HTTP method
  • 48. 48 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 Web Socket 1.0 (JSR 356)
  • 49. 49 #25: WebSocket: Annotated server endpoint Enables full-duplex bi-directional communication over single TCP connection @javax.websocket.server.ServerEndpoint("/chat")
 public class ChatServer {
 
 @OnMessage
 public String chat(String name, Session session) {
 for (Session peer : client.getOpenSessions()) {! peer.getBasicRemote().sendObject(message);! }
 }
 }!
  • 50. 50 #26: WebSocket: Lifecycle callbacks @javax.websocket.OnOpen
 public void open(Session s) { . . . }
 
 @javax.websocket.OnClose
 public void close(CloseReason c) { . . . }
 
 @javax.websocket.OnError
 public void error(Throwable t) { . . . }!
  • 51. 51 #27: WebSocket: Annotated client endpoint @javax.websocket.ClientEndpoint
 public class MyClient {
 @javax.websocket.OnOpen
 public void open(Session session) { … }
 
 // Lifecycle callbacks
 }!
  • 52. 52 #27: WebSocket: Annotated client endpoint ContainerProvider
 .getWebSocketContainer()
 .connectToServer(
 MyClient.class, 
 URI.create("ws://. . ."));!
  • 53. 53 #28: WebSocket: Programmatic endpoints public class ChatServer extends Endpoint {
 @Override
 public void onOpen(Session s, EndpointConfig ec) {
 s.addMessageHandler(new MessageHandler.Whole<String>() { public void onMessage(String text) { . . . }
 }
 }
 
 @Override
 public void onClose(Session s, CloseReason cr) { . . . }
 
 //. . . 
 }!
  • 54. 54 #28: WebSocket: Programmatic endpoints public class MyApplicationConfig implements ServerApplicationConfig {
 public Set<ServerEndpointConfig> getEndpointConfigs(…) { 
 ServerEndpointConfig.Builder
 .create(MyEndpoint.class, "/websocket”)
 .configurator(new MyConfig())
 .build()
 }
 }!
  • 55. 55 #28: WebSocket: Programmatic endpoints public class MyConfig extends ServerEndpointConfig.Configurator {
 
 public <T> T getEndpointInstance(. . .) { . . . }
 
 public void modifyHandshake(. . .) { . . . }
 
 . . .
 }!
  • 56. 56 #29: WebSocket: Encoder and Decoder @javax.websocket.server.ServerEndpoint(
 value="/chat",
 decoders="MyDecoder.class",
 encoders="MyEncoder.class")
 public class ChatServer {
 
 @OnMessage
 public String chat(ChatMessage name, Session session) {
 . . . 
 }
 }!
  • 57. 57 #29: WebSocket: Encoder and Decoder public class MyDecoder implements Decoder.Text<ChatMessage> {
 public ChatMessage decode(String s) {
 // . . .
 }
 
 public boolean willDecode(String string) {
 // . . .
 }
 
 //. . .
 }
 
 !
  • 58. 58 #29: WebSocket: Encoder and Decoder public class MyEncoder implements Encoder.Text<ChatMessage> {
 
 public String encode(ChatMessage chatMessage) {
 // . . .
 }
 ! // . . .
 }!
  • 59. 59 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 Expression Language 3.0 (JSR 341)
  • 60. 60 #30: Expression Langauge: ELProcessor Use EL in a stand-alone environment Evaluate EL expressions Defining a static method as an EL function Defining an object instance as an EL name ELProcessor elp = new ELProcessor();
 elp.defineBean("employee", new Employee("Charlie Brown"));
 String name = elp.eval("employee.name");!
  • 61. 61 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 JSF 2.2 (JSR 344)
  • 62. 62 #31: JSF: Faces Flow ./src/main/webapp/flow1
 /flow1.xhtml
 /flow1a.xhtml
 /flow1b.xhtml
 ./src/main/webapp/flow2
 /flow2-flow.xml
 /flow2.xhtml
 /flow2a.xhtml
 /flow2b.xhtml
 /index.xhtml! Package reusable flows in JAR
  • 63. 63 #31: JSF: Faces Flow @Named
 @FlowScoped("flow1")
 public class Flow1Bean implements Serializable {
 }! ! @Produces @FlowDefinition
 public Flow defineFlow(@FlowBuilderParameter FlowBuilder fb) {
 String flowId = "flow1";
 //. . .
 return fb.getFlow();
 }! Package reusable flows in JAR
  • 64. 64 #31: JSF: Faces Flow #{flowScope}: Local flow storage #{facesContext.application.flowHandler.currentFlow}: Returns true if within a flow Package reusable flows in JAR
  • 65. 65 #32: JSF: Resource Library Contract index-blue.xhtml
 index-red.xhtml
 WEB-INF/lib/contracts-library-1.0-SNAPSHOT.jar
 /META-INF/contracts/blue
 /style.css
 /javax.faces.contract.xml
 /template.xhtml
 /META-INF/contracts/red
 /style.css
 /javax.faces.contract.xml
 /template.xhtml! Apply templates in a reusable and interchangeable manner
  • 66. 66 #32: JSF: Resource Library Contract <f:view contracts=”red”>
 <ui:composition template="/template.xhtml">
 . . .
 </ui:composition>
 </f:view>
 ! Apply templates in a reusable and interchangeable manner
  • 67. 67 #33: JSF: Pass-through Attributes <h:inputText type="email" value="#{user.email}"/> 
 ! <input type="text" name="j_idt6:j_idt10"/>! HTML5-Friendly Markup <h:inputText p:type="email" value="#{user.email}"/> 
 
 <input type="email" name="j_idt6:j_idt10"/>! !
  • 68. 68 #34: JSF: File Upload Component <h:form enctype="multipart/form-data">
 <h:inputFile value="#{fileUploadBean.file}"/><br/>
 <h:commandButton value="Upload"/><p/>
 </h:form> ! @Named @RequestScoped 
 public class FileUploadBean {
 private Part file;
 
 //getter and setter
 } !
  • 69. 69 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 JAX-RS 2.0 (JSR 339)
  • 70. 70 #35: JAX-RS: Client API Client client = ClientBuilder.newClient();! WebTarget target = client.target("http://www.foo.com/ book");! Invocation invocation = target.request(TEXT_PLAIN).buildGet();! Response response = invocation.invoke();! ! Response response = ClientBuilder.newClient()! .target("http://www.foo.com/book")! .request(MediaType.TEXT_PLAIN)! .get();! ! String body = ClientBuilder.newClient()! .target("http://www.foo.com/book")! .request()! .get(String.class);! New API to consume rest services
  • 71. 71 #36: JAX-RS: Async Client Future<String> future = ClientBuilder.newClient()! .target("http://www.foo.com/book")! .request()! .async()! .get(String.class);! ! try {! String body = future.get(1, TimeUnit.MINUTES);! } catch (InterruptedException | ExecutionException e) { . . .
 }! The client API also supports asynchronous invocation
  • 72. 72 #37: JAX-RS: Async Server @Path("/async")! public class AsyncResource {! ! @GET! public void asyncGet(@Suspended AsyncResponse asyncResp) {! ! new Thread(new Runnable() {! ! public void run() {! String result = veryExpensiveOperation();! asyncResp.resume(result);! }! }).start();! }}! Asynchronous request processing on the server
  • 73. 73 #38: JAX-RS: Message Filter Filters on client side ClientRequestFilter! ClientResponseFilter! Filters on server side ContainerRequestFilter! ContainerResponseFilter! Used to process incoming and outgoing request or response headers
  • 74. 74 #38: JAX-RS: Message Filter public class LogginFilter implements ClientRequestFilter {! ! public void filter(ClientRequestContext ctx) throws IOException {! System.out.println(ctx.getMethod());! System.out.println(ctx.getUri());! }! }! Used to process incoming and outgoing request or response headers
  • 75. 75 #39: JAX-RS: Entity Interceptors Intercepts inbound entity streams (reads from the “wire”) ReaderInterceptor! Intercepts outbound entity streams (writes to the “wire”) WriterInterceptor! Marshalling and unmarshalling HTTP message bodies
  • 76. 76 #39: JAX-RS: Entity Interceptors public class GZipInterceptor implements WriterInterceptor {! ! public void aroundWriteTo(WriterInterceptorContext ctx){! OutputStream os = ctx.getOutputStream();! ctx.setOutputStream(new GZIPOutputStream(os));! ctx.proceed();! }! }! Marshalling and unmarshalling HTTP message bodies
  • 77. 77 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 JSON-P 1.0 (JSR 353)
  • 78. 78 #40: JSON-P: JSON Builder JsonObject value = Json.createObjectBuilder()! .add("id", "1234")! .add("date", "19/09/2012")! .add("total_amount", "93.48")! .add("customer", Json.createObjectBuilder()! .add("first_name", "James")! .add("last_name", "Rorrison")! .add("email", "j.rorri@me.com")! .add("phoneNumber", "+44 12341234")! )! .build();! Creates an object model (or an array) in memory by adding elements
  • 79. 79 #41: JSON-P: JsonParser JsonParser parser = Json.createParser(new FileReader(“order.json"));! while (parser.hasNext()) {! JsonParser.Event event = parser.next();! ! if (event.equals(JsonParser.Event.KEY_NAME) && ! parser.getString().matches("email")) {! parser.next();! email = parser.getString();! }! }! Event-based parser that can read JSON data from a stream
  • 80. 80 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 Batch 1.0 (JSR 352)
  • 81. 81 #42: Batch: Chunk-style Processing Item-oriented Processing Style (primary)
  • 82. 82 #42: Batch: Chunk-style Processing <step id=”sendStatements”>! <chunk item-count=“3”>
 <reader ref=”accountReader”/>! <processor ref=”accountProcessor”/>
 <writer ref=”emailWriter”/>! </step>! …implements ItemReader {
 public Object readItem() {
 // read account using JP }! ! …implements ItemProcessor {! public Object processItems(Object account) {
 // read Account, return Statement! }! ! …implements ItemWriter {! public void writeItems(List accounts) {
 // use JavaMail to send email! }! !
  • 83. 83 #43: Batch: Batchlet-style Processing Task-oriented processing style <step id=”transferFile”>! <batchlet ref=“MyFileTransfer” />! </step>! …implements Batchlet {! @Override
 public void process() {
 // Transfer file! }! !
  • 84. 84 #44: Batch: Job/Step/Chunk Listeners <job id="myJob" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0”>
 <listeners>
 <listener ref="myJobListener"/>
 </listeners>
 <step id="myStep" >
 <listeners>
 <listener ref="myStepListener"/>
 <listener ref="myChunkListener"/>
 <listener ref="myItemReadListener"/>
 <listener ref="myItemProcessorListener"/>
 <listener ref="myItemWriteListener"/>
 </listeners>
 <chunk item-count="3”>. . .</chunk>
 </step>
 </job>! !
  • 85. 85 #44: Batch: Job/Step/Chunk Listeners Interface Abstract Classes JobListener! AbstractJobListener! StepListener! AbstractStepListener! ChunkListener! AbstractChunkListener! ItemRead/Write/ ProcessListener! AbstractItemRead/Write/ ProcessListener! SkipRead/Write/ ProcessListener! AbstractSkipRead/Write/ ProcessListener! RetryRead/Write/ ProcessListener! AbstractRetryRead/Write/ ProcessListener!
  • 86. 86 #44: Batch: Job/Step/Chunk Listeners @Named
 public class MyJobListener extends AbstractJobListener {
 
 @Override
 public void beforeJob() throws Exception { . . . }
 
 @Override
 public void afterJob() throws Exception { . . . }
 }!
  • 87. 87 #45: Batch: Partition <step>
 <chunk item-count="3">
 <reader ref="myItemReader">
 <properties>
 <property name="start" value="#{partitionPlan['start']}"/>
 <property name="end" value="#{partitionPlan['end']}"/>
 </properties> 
 </reader>
 . . .
 </chunk>!
  • 88. 88 #45: Batch: Partition <partition>
 <plan partitions="2">
 <properties partition="0">
 <property name="start" value="1"/>
 <property name="end" value="10"/>
 </properties>
 <properties partition="1">
 <property name="start" value="11"/>
 <property name="end" value="20"/>
 </properties>
 </plan>
 </partition>
 </step>!
  • 89. 89 #46: Batch: Creating Workflows <flow id="flow1" next="step3">
 <step id="step1" next="step2"> . . . </step>
 <step id="step2"> . . . </step>
 </flow>
 <step id="step3"> . . . </step>! Flow: Elements that execute together as a unit
  • 90. 90 #46: Batch: Creating Workflows <split id="split1" next=" . . . ">
 <flow id="flow1”>
 <step id="step1”> . . . </step>
 </flow>
 <flow id="flow2”>
 <step id="step2”> . . . </step>
 </flow>
 </split>! Split: Concurrent execution of flows
  • 91. 91 #46: Batch: Creating Workflows <step id="step1" next="decider1">. . .</step>
 <decision id="decider1" ref="myDecider"> 
 <next on="DATA_LOADED" to="step2"/> 
 <end on="NOT_LOADED"/> </decision>
 <step id="step2">. . .</step> ! ! Decision: Customized way of sequencing between steps, flows, splits @Named
 public class MyDecider implements Decider {
 @Override
 public String decide(StepExecution[] ses) throws Exception {
 . . .
 return "DATA_LOADED"; // or "NOT_LOADED"! } ! }!
  • 92. 92 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 JavaMail 1.5 (JSR 919)
  • 93. 93 #47: JavaMail @MailSessionDefinition(name = "java:comp/myMailSession",
 properties = {
 "mail.smtp.host=smtp.gmail.com",
 "mail.smtp.ssl.enable=true",
 "mail.smtp.auth=true",
 "mail.transport.protocol=smtp",
 "mail.debug=true"
 })
 
 
 @Resource(lookup = "java:comp/myMailSession")
 Session session;!
  • 94. 94 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 JCA 1.7 (JSR 322)
  • 95. 95 #48: Java Connector Architecture @ConnectionDefinition(
 connection="MyConnection.class",
 connectionImpl="MyConnectionImpl.class",
 connectionFactory="MyConnectionFactory.class",
 connectionFactoryImpl="MyConnectionFactoryImpl.class"
 )
 ! @AdministeredObjectDefinition(
 className="MyQueueImpl.class",
 name="java:comp/MyQueue",
 resourceAdapter="myAdapter",
 )!
  • 96. 96 JAX-RS 2.0 JSON-P 1.0Web Socket 1.0 Servlet 3.1 JSF 2.2EL 3.0 JSP JSTL BeanValidation1.1 Interceptors1.2 CDI1.1 Concurrency1.0 JPA 2.1 JTA 1.2 EJB 3.2 JMS 2.0 Batch 1.0 JCA 1.7 Java EE 7 JavaMail 1.5 Java EE 7 (JSR 342)
  • 97. 97 #49: Default Resources JNDI name: java:comp/DefaultDataSource Default Data Source @Resource(lookup="java:comp/DefaultDataSource")
 DataSource myDS;
 ! @Resource
 DataSource myDS; !
  • 98. 98 #49: Default Resources JNDI name: java:comp/DefaultJMSConnectionFactory
 
 @Resource(lookup="java:comp/DefaultJMSConnectionFactory”)
 ConnectionFactory myCF; @Resource
 ConnectionFactory myCF;! Default JMS Connection Factory
  • 99. 99 #49: Default Resources JNDI names java:comp/DefaultManagedExecutorService! java:comp/DefaultManagedScheduledExecutorService! java:comp/DefaultManagedThreadFactory! java:comp/DefaultContextService! Default Concurrency Utilities Objects
  • 100. 100 #50: Buy our books!
  • 102. 102