50 features of Java EE 7 in 50 minutes at JavaZone 2014
- 1. 1
50 new features
of
Java EE 7
in
50 minutes
Arun Gupta, @arungupta
Director, Developer Advocacy
Sep 9, 2014
- 3. 3
JAX-RS
2.0
JSON-P
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
- 4. 4
JAX-RS
2.0
JSON-P
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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!
all behaves like in Java EE 6 (default if not set)!
!
<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
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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
Pre/post conditions on method and constructors
public class CardValidator {!
!
public CardValidator(@NotNull Algorithm algorithm) {!
this.algorithm = algorithm;!
}!
!
@AssertTrue!
public Boolean validate(@NotNull CreditCard creditCard) {!
return algorithm.validate(creditCard.getNumber());!
}!
}!
- 9. 9
JAX-RS
2.0
JSON-P
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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! p r i vlaotgeg evro.ifdi inne(i"t(EInntveorciantgi ocnoCnosnttreuxctt oirc")) ;{!! ilco.ggperor.cefeidn(e()";!Exiting constructor");! ! }! @pAurboluincd IOnbvjoekcet! 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
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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
Default ManagedExectuor
@Resource
ManagedExecutorService executor;
!
ManagedExecutorService executor = (ManagedExecutorService)
ctx.lookup("java:comp/DefaultManagedExecutorService");!
- 15. 15
#06: Concurrency: ManagedExecutor
Specify in web.xml
<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>!
- 16. 16
#07: Concurrency: ManagedScheduledExecutor
Managed version of ScheduledExecutorService!
Submit delayed or periodic tasks
@Resource
ManagedScheduledExecutorService executor;!
- 17. 17
#07: Concurrency: ManagedScheduledExecutor
Access using JNDI
InitialContext ctx = new InitialContext();
ManagedScheduledExecutorService executor =
(ManagedScheduledExecutorService)ctx.lookup(
"java:comp/
DefaultManagedScheduledExecutorService");
!
Can be defined in web.xml as well
- 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
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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 Persistence Context
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
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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 BookBean b1;!
@Inject BookBean b2;!
@Transactional!
protected void processRequest(...) {!
s_out.println(b1.getReference());!
s_out.println(b2.getReference());!
}!
}!
- 31. 31
JAX-RS
2.0
JSON-P
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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
In some cases increases performance, scalability and
robustness
@Stateful(passivationCapable = false)!
public class ShoppingCart {!
...!
}!
- 33. 33
#17: EJB-Lite: Async + Non-persistent timer
Extended the EJB Lite to include local asynchronous invocations
and non-persistent EJB Timer Service
@Stateless!
public class OrderEJB {!
!
@Asynchronous! public void sendEmail (Order order) {!
// Very Long task!
}!
!
@Schedule(hour="2", persistent=false)!
public void createDailyReport() {!
// ...!
}!
}!
- 34. 34
JAX-RS
2.0
JSON-P
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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
JMSContext ctx = connectionFactory.createContext()!
!
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
A JMS ConnectionFactory can be defined using an annotation
on a container-managed class
@Stateless!
@JMSConnectionFactoryDefinition(!
name = "java:app/jms/MyConnectionFactory",!
interfaceName =
"javax.jms.TopicConnectionFactory")! !
!
!
public class ExpensiveOrderEJB {...}!
- 38. 38
#21: JMS: JMSDestinationDefinition
A JMS queue or topic can be defined using an annotation
@Stateless!
@JMSConnectionFactoryDefinition(!
name = "java:app/jms/MyConnectionFactory",!
"j a v a x . j imnst.eTrofpaicceCNoanmnee c=t ionFactory")!
@JMSDestinationDefinition(!
name = "java:app/jms/MyTopic",!
interfaceName = "javax.jms.Topic")! public class ExpensiveOrderEJB {...}!
- 39. 39
JAX-RS
2.0
JSON-P
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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
New methods to existing interfaces
ServletInputStream!
public void setReadListener(ReadListener
listener);!
public boolean isFinished();!
public boolean isReady();!
ServletOutputStream!
public setWriteListener(WriteListener
listener);!
public boolean canWrite();!
- 42. 42
#22: Servlet: Non-blocking I/O
New interfaces
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();
}!
- 43. 43
#22: Servlet: Non-blocking I/O
Only for Asynchronous Servlets
AsyncContext context = request.startAsync();
ServletInputStream input =
request.getInputStream();
input.setReadListener(
new MyReadListener(input, context)); !
- 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
Deny an HTTP method request for an uncovered HTTP method
<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> !
!
- 47. 47
#24: Servlet: Improved Security
Deny an HTTP method request for an uncovered HTTP method
<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> !
!
- 48. 48
JAX-RS
2.0
JSON-P
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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
Get/set bean properties
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
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
JSF 2.2 (JSR 344)
- 62. 62
#31: JSF: Faces Flow
Package reusable flows in JAR
./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!
- 63. 63
#31: JSF: Faces Flow
Package reusable flows in JAR
@Named
@FlowScoped("flow1")
public class Flow1Bean implements Serializable {
}!
!
@Produces @FlowDefinition
public Flow defineFlow(@FlowBuilderParameter FlowBuilder
fb) {
String flowId = "flow1";
//. . .
return fb.getFlow();
}!
- 64. 64
#31: JSF: Faces Flow
Package reusable flows in JAR
#{flowScope}: Local flow storage
#{facesContext.application.flowHandler.currentFlow}
: Returns true if within a flow
- 65. 65
#32: JSF: Resource Library Contract
Apply templates in a reusable and interchangeable manner
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!
- 66. 66
#32: JSF: Resource Library Contract
Apply templates in a reusable and interchangeable manner
<f:view contracts=”red”>
<ui:composition template="/template.xhtml">
. . .
</ui:composition>
</f:view>
!
- 67. 67
#33: JSF: Pass-through Attributes
HTML5-Friendly Markup
<h:inputText type="email" value="#{user.email}"/>
!
<input type="text" name="j_idt6:j_idt10"/>!
<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
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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
New API to consume rest services
Client client = ClientBuilder.newClient();!
WbeoboTk"a)r;g!et target = client.target("http://www.foo.com/
Itanrvgoceat.tireonq uiensvt(oTcEaXtTi_oPnL A=I N).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);!
- 71. 71
#36: JAX-RS: Async Client
The client API also supports asynchronous invocation
Future<String> future = ClientBuilder.newClient()!
.target("http://www.foo.com/book")!
.request()!
.async()! .get(String.class);!
!
try {!
String body = future.get(1, TimeUnit.MINUTES);!
{} ..c.at}!ch (InterruptedException | ExecutionException e)
- 72. 72
#37: JAX-RS: Async Server
Asynchronous request processing on the server
@Path("/async")!
public class AsyncResource {!
!
@GET!
a spynubcRleics p)v o{i!d asyncGet(@Suspended AsyncResponse
!
new Thread(new Runnable() {!
!
public void run() {!
String result = veryExpensiveOperation();!
asyncResp.resume(result);! }!
}).start();!
}}!
- 73. 73
#38: JAX-RS: Message Filter
Used to process incoming and outgoing request or response
headers
Filters on client side
ClientRequestFilter!
ClientResponseFilter!
Filters on server side
ContainerRequestFilter!
ContainerResponseFilter!
- 74. 74
#38: JAX-RS: Message Filter
Used to process incoming and outgoing request or response
headers
public class LogginFilter implements ClientRequestFilter {!
!
I O E xcpeubpltiico n v{o!id filter(ClientRequestContext ctx) throws
System.out.println(ctx.getMethod());!
System.out.println(ctx.getUri());!
}!
}!
- 75. 75
#39: JAX-RS: Entity Interceptors
Marshalling and unmarshalling HTTP message bodies
Intercepts inbound entity streams (reads from the “wire”)
ReaderInterceptor!
Intercepts outbound entity streams (writes to the “wire”)
WriterInterceptor!
- 76. 76
#39: JAX-RS: Entity Interceptors
Marshalling and unmarshalling HTTP message bodies
public class GZipInterceptor implements
WriterInterceptor {!
!
c t x) {p!ublic void aroundWriteTo(WriterInterceptorContext
OutputStream os = ctx.getOutputStream();!
ctx.setOutputStream(new GZIPOutputStream(os));!
ctx.proceed();!
}!
}!
- 77. 77
JAX-RS
2.0
JSON-P
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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
Creates an object model (or an array) in memory by adding
elements
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 1234 1234"))!
.build();!
- 79. 79
#41: JSON-P: JsonParser
Event-based parser that can read JSON data from a stream
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();!
}!
}!
- 80. 80
JAX-RS
2.0
JSON-P
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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 JPA!
}!
!
…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/
AbstractItemRead/Write/
ProcessListener!
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: Elements that execute together as a unit
<flow id="flow1" next="step3">
<step id="step1" next="step2"> . . . </step>
<step id="step2"> . . . </step>
</flow>
<step id="step3"> . . . </step>!
- 90. 90
#46: Batch: Creating Workflows
Split: Concurrent execution of flows
<split id="split1" next=" . . . ">
<flow id="flow1”>
<step id="step1”> . . . </step>
</flow>
<flow id="flow2”>
<step id="step2”> . . . </step>
</flow>
</split>!
- 91. 91
#46: Batch: Creating Workflows
Decision: Customized way of sequencing between steps, flows,
splits
<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> !
!
@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
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
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
JSP EL 3.0 JSF 2.2
JSTL
Web Socket 1.0
Servlet 3.1 1.0
Bean Validation 1.1
Interceptors 1.2
CDI 1.1
Concurrency 1.0
JTA 1.2 EJB 3.2 JMS 2.0
JPA 2.1
Batch 1.0
JCA 1.7
Java EE 7
JavaMail
1.5
Java EE 7 (JSR 342)
- 97. 97
#49: Default Resources
Default Data Source
JNDI name: java:comp/DefaultDataSource
@Resource(lookup="java:comp/DefaultDataSource")
DataSource myDS;
!
@Resource
DataSource myDS; !
- 98. 98
#49: Default Resources
Default JMS Connection Factory
JNDI name: java:comp/
DefaultJMSConnectionFactory
@Resource(lookup="java:comp/DefaultJMSConnectionFactory")
ConnectionFactory myCF;
@Resource
ConnectionFactory myCF;!
- 99. 99
#49: Default Resources
Default Concurrency Utilities Objects
JNDI names
java:comp/DefaultManagedExecutorService!
java:comp/
DefaultManagedScheduledExecutorService!
java:comp/DefaultManagedThreadFactory!
java:comp/DefaultContextService!