Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.1
JSR 236: Introduction to
Concurrency Utilities for
Java EE 1.0
Anthony Lai
Oracle
Fred Rowe
IBM
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.3
The following is intended to outline our general pro...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.4
Program Agenda
 Overview
 Managed Objects
 Featur...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.5
Overview
 Provide a simple and flexible standard AP...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.6
Overview
 2003 – JSR 236 and JSR237 filed. CommonJ ...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.7
Overview
 Simple, standardized API for using concur...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.8
Overview
 Provides 4 types of managed objects that ...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.9
Program Agenda
 Overview
 Managed Objects
 Featur...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.10
Managed Objects
 Managed Objects are provided by t...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.11
ManagedThreadFactory
 A standard way for applicati...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.12
ManagedThreadFactory
 Interface extends from java....
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.13
ManagedThreadFactory
 Thread interrupted when Mana...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.14
ManagedThreadFactory
// Create a ThreadPoolExecutor...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.15
ManagedThreadFactory
@WebServlet(asyncSupported=tru...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.16
ManagedExecutorService
 For running tasks asynchro...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.17
ManagedExecutorService
 Extends from java.util.con...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.18
ManagedExecutorService
Example 1
@Resource ManagedE...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.19
ManagedExecutorService
Example 2 – Use with Asynchr...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.20
ManagedExecutorService
Managed Thread Pool Executor...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.21
ManagedScheduledExecutorService
 For scheduling ta...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.22
ManagedScheduledExecutorService
 Extends from Mana...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.23
ManagedScheduledExecutorService
API from ScheduledE...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.24
ManagedScheduledExecutorService
API for Custom Sche...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.25
ManagedScheduledExecutorService
Trigger
 For suppo...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.26
ManagedScheduledExecutorService
Trigger API
boolean...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.27
ManagedScheduledExecutorService
Trigger Example
pub...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.28
ContextService
 For creating contextual proxy obje...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.29
ContextService
 Contextual proxy objects customiza...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.30
ContextService
 For creating contextual proxy obje...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.31
ContextService
Example 1
@Resource ContextService c...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.32
ContextService
Example 2
// In application
public i...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.33
ContextService
Example 2 (cont’d)
// Elsewhere, in ...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.34
Program Agenda
 Overview
 Managed Objects
 Featu...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.35
Context Propagation
 Types of container context to...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.36
Context Propagation
 Application context captured ...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.37
Transaction Management
 Transactions are not propa...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.38
Task Events Notifications
 Task lifecycle events n...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.39
Task Events Notifications
ManagedTaskListener
 Man...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.40
Task Events Notifications
ManagedTaskListener API
...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.41
Task Events Notifications
Registering ManagedTaskLi...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.42
ManagedTask
Overview
 Any task submitted to an Man...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.43
ManagedTask
API
 API
– Map<String, String> getExec...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.44
ManagedExecutors
Overview
 Utility class in javax....
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.45
ManagedExecutors
API
 public static boolean isCurr...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.46
Program Agenda
 Overview
 Managed Objects
 Featu...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.47
Summary
 Provides asynchronous capabilities to Jav...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.48
Program Agenda
 Overview
 Managed Objects
 Featu...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.49
Resources
 Spec and API docs
– http://jcp.org/en/j...
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.50
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.51
Graphic Section Divider
Upcoming SlideShare
Loading in …5
×

JSR 236 Concurrency Utils for EE presentation for JavaOne 2013 (CON7948)

3,864 views

Published on

Presentation about the newly released JSR236 spec that Anthony Lai (Oracle) and Fred Rowe (IBM) did for session CON7948 at JavaOne SF 2013.
JSR 236 is part of EE7 platform and defines extensions to the SE concurrency APIs to allow them to be used in an app server environment.

Published in: Technology, Education
  • Be the first to comment

JSR 236 Concurrency Utils for EE presentation for JavaOne 2013 (CON7948)

  1. 1. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.1
  2. 2. JSR 236: Introduction to Concurrency Utilities for Java EE 1.0 Anthony Lai Oracle Fred Rowe IBM
  3. 3. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.3 The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.
  4. 4. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.4 Program Agenda  Overview  Managed Objects  Features  Summary  Resources
  5. 5. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.5 Overview  Provide a simple and flexible standard API for application component providers to design applications using concurrency design principles  Provide a simple migration path from Java SE Concurrency Utilities (JSR-166) to the Java EE platform by providing consistency between the two platforms  Allow application component providers to easily add concurrency to existing Java EE applications  Support simple and advanced concurrency patterns without sacrificing usability Goals
  6. 6. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.6 Overview  2003 – JSR 236 and JSR237 filed. CommonJ API provides context aware Work Managers and Timers to Java EE applications  2006 – CommonJ API replaced by API that extends from Java SE concurrency utilities  2008 – Merged into JSR 236  2008 – 2012 …  2012 – JSR 236 restarted  2013 – JSR 236 released and become part of Java EE 7 History
  7. 7. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.7 Overview  Simple, standardized API for using concurrency from application components  Extension of Java SE Concurrency Utilities APIs (JSR-166)  Provide low-level asynchronous processing capabilities to Java EE application components in a safe, reliable, consistent manner  Manage and monitor the lifecycle of asynchronous operations Main Features
  8. 8. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.8 Overview  Provides 4 types of managed objects that implement these interfaces in javax.enterprise.concurrent package: – ManagedExecutorService – ManagedScheduledExecutorService – ManagedThreadFactory – ContextService  Container context propagation  Transaction management  Task events notification Main Features
  9. 9. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.9 Program Agenda  Overview  Managed Objects  Features  Summary  Resources
  10. 10. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.10 Managed Objects  Managed Objects are provided by the Java EE Product Provider  Applications access managed objects by – JNDI lookup – resource injection using @Resource  Configurable  Pre-configured default managed objects are available – e.g. java:comp/DefaultManagedThreadFactory Overview
  11. 11. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.11 ManagedThreadFactory  A standard way for applications to obtain a container-managed threads from Java EE Containers  Supports context propagation  Can be used with asynchronous processing API in Servlets  Can be used for creating custom executors in advanced use cases Overview
  12. 12. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.12 ManagedThreadFactory  Interface extends from java.util.concurrent.ThreadFactory – Same API: Thread.newThread(Runnable) – Container context captured at ManagedThreadFactory creation will be propagated to the thread returned  Threads returned by newThread() method are required to implement the ManagableThread interface – boolean isShutdown()  Can be used with Java SE concurrency utilities APIs where ThreadFactory is needed. e.g. in java.util.concurrent.Executors API
  13. 13. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.13 ManagedThreadFactory  Thread interrupted when ManagedThreadFactory shuts down  Runnable implementations should check ManagableThread.isShutdown() when interrupted – clean up if it returns true Shutdown
  14. 14. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.14 ManagedThreadFactory // Create a ThreadPoolExecutor using a ManagedThreadFactory. @Resource ManagedThreadFactory tf; public ExecutorService getManagedThreadPool() { // All threads will run as part of this application component. return new ThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), tf); } Example 1
  15. 15. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.15 ManagedThreadFactory @WebServlet(asyncSupported=true) public class TestServlet extends HttpServlet { @Resource private ManagedThreadFactory managedThreadFactory; protected void doGet(HttpServletRequest req, HttpServletResponse res { final AsyncContext asyncContext = req.startAsync(); … Runnable runnable = new Runnable() { public void run() { … asyncContext.complete(); } }; Thread thread = managedThreadFactory.newThread(runnable); thread.start(); … } } Example 2 – Use with Asynchronous Servlet
  16. 16. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.16 ManagedExecutorService  For running tasks asynchronously on threads provided by Java EE product provider – Tasks must implement either java.util.concurrent.Callable or java.lang.Runnable  Supports context propagation  Allow application developers to use familiar Java SE APIs for concurrent processing of tasks in Java EE Overview
  17. 17. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.17 ManagedExecutorService  Extends from java.util.concurrent.ExecutorService – execute, submit, invokeAll, invokeAny – No new APIs  Future is returned upon task submission – Checks for the task execution status – Cancels the task – Waits and retrieves result  Lifecycle APIs disabled – throws IllegalStateException – awaitTermination, isTerminated, isShutdown, shutdown, shutd ownNow API
  18. 18. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.18 ManagedExecutorService Example 1 @Resource ManagedExecutorService mes; void someMethod() { Callable<Integer> c = new Callable<>() { Integer call() { // Interact with a database...return answer. } //Submit the task and do something else. Future result = mes.submit(c); ... //Get the result when ready... int theValue = result.get(); ...
  19. 19. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.19 ManagedExecutorService Example 2 – Use with Asynchronous Servlet @WebServlet(asyncSupported=true) public class TestAsyncMESServlet extends HttpServlet { @Resource private ManagedExecutorService managedExecutorService; protected void doGet(HttpServletRequest req, HttpServletResponse res { final AsyncContext asyncContext = req.startAsync(); … Runnable runnable = new Runnable() { public void run() { … asyncContext.complete(); } }; managedExecutorService.submit(runnable); … } }
  20. 20. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.20 ManagedExecutorService Managed Thread Pool Executor Component Relationship
  21. 21. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.21 ManagedScheduledExecutorService  For scheduling tasks to run – after a given delay – periodically – at some custom schedule  Tasks are run on threads that are provided by the Java EE container  Supports context propagation  Allows application developers to use familiar Java SE APIs for submitting scheduled tasks in Java EE Overview
  22. 22. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.22 ManagedScheduledExecutorService  Extends from ManagedExecutorService  Extends from java.util.concurrent.ScheduledExecutorService – schedule, scheduleAtFixedRate, scheduleWithFixedDelay  Lifecycle APIs disabled – throws IllegalStateException – awaitTermination, isTerminated, isShutdown, shutdown, shutd ownNow  Extension API to support custom scheduling – schedule with Trigger API
  23. 23. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.23 ManagedScheduledExecutorService API from ScheduledExecutorService <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit); ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit); ScheduledFuture<?> scheduleAtFixedFate(Runnable command, long initialDelay, long period, TimeUnit unit); ScheduledFuture<?> scheduledWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit);
  24. 24. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.24 ManagedScheduledExecutorService API for Custom Scheduling <V> ScheduledFuture<V> schedule(Callable<V> callable, Trigger trigger); ScheduledFuture<?> schedule(Runnable command, Trigger trigger);
  25. 25. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.25 ManagedScheduledExecutorService Trigger  For supporting custom scheduling rules – Can be simple: single, absolute date/time – Can be complex calendar logic – Next trigger time can be calculated based on previous trigger execution date/time and result  Implemented by application developers  Submitted along with a task using the schedule method in ManagedScheduledExecutorService
  26. 26. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.26 ManagedScheduledExecutorService Trigger API boolean skipRun(LastExecution lastExecutionInfo, Date scheduledRunTime) Date getNextRunTime(LastExecution lastExecutionInfo, Date taskScheduledTime)
  27. 27. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.27 ManagedScheduledExecutorService Trigger Example public class SimpleFixedDateTrigger implements Trigger { private Date fireTime; public SimpleFixedDateTrigger(Date triggerDate) { fireTime = triggerDate; } public Date getNextRunTime( LastExecution lastExecutionInfo, Date taskScheduledTime) { if(taskScheduledTime.after(fireTime)) { return null; } return fireTime; } public boolean skipRun(LastExecution lastExecutionInfo, Date scheduledRunTime) { return scheduledRunTime.after(fireTime); } }
  28. 28. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.28 ContextService  For creating contextual proxy objects – Application context is captured upon creation – Proxy object methods will run within the captured context at a later time  For use in advanced use cases – E.g. to propagate user identity – E.g. to request task listener notifications to be run under container context  Uses dynamic proxy mechanism in java.lang.reflect package Overview
  29. 29. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.29 ContextService  Contextual proxy objects customizable through execution properties – Transaction property – Vendor specific properties, e.g. vendorA.security_token_expiration  API for returning the execution properties on the given contextual object proxy instance – Map<String,String> getExecutionProperties(Object contextualProxy) Execution Properties
  30. 30. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.30 ContextService  For creating contextual proxy objects: – <T> T createContextualProxy(T instance, Class<T> intf) – Object createContextualProxy(Object instance, Class<?>... Interfaces) – <T> T createContextualProxy(T instance, Map<String,String> executionProperties, Class<T> intf) – Object createContextualProxy(Object instance, Map<String,String> executionProperties, Class<?>... Interfaces) API
  31. 31. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.31 ContextService Example 1 @Resource ContextService ctxSvc; MyAppIntf proxy = ctxSvc.createContextualProxy (myAppImpl, MyAppIntf.class); // invoke at a later time, possibly in a different app // component proxy.doSomething();
  32. 32. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.32 ContextService Example 2 // In application public interface MessageProcessor { public void processMessage(Message msg) … } // Within servlet or EJB method… @Resource ContextService ctxSvc; void businessMethod() { MessageProcessor msgProcessor = … // Wrap with the current context MessageProcessor proxy = ctxSvc.createContextualProxy (msgProcessor, MessageProcessor.class); // Store the contextual proxy object somewhere for running later. store.putIt(proxy); …
  33. 33. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.33 ContextService Example 2 (cont’d) // Elsewhere, in a different thread, retrieve the MessageProcessor contextual proxy // object from the store MessageProcessor proxy = store.getIt(); // The proxy method processMessage() is invoked on // this thread, but with the context of the servlet or // EJB that created it. proxy.processMessage(msg);
  34. 34. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.34 Program Agenda  Overview  Managed Objects  Features  Summary  Resources
  35. 35. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.35 Context Propagation  Types of container context to be propagated – Class loading, JNDI namespace, security identity  Configurable  Extensible  Supported in all 4 types of managed objects Overview
  36. 36. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.36 Context Propagation  Application context captured at – Task submission – ManagedThreadFactory creation – Contextual proxy object creation  Application context propagated to thread – Before task execution – During invocation of contextual proxy object methods (with the exception of hashCode, equals, toString and all other methods declared in Object) Overview (cont’d)
  37. 37. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.37 Transaction Management  Transactions are not propagated to the threads where tasks are run  UserTransaction from JTA is available  Contextual proxy objects from ContextService can be run on the same transaction context of the invoking thread – Configurable via execution property ManagedTask.TRANSACTION  ManagedTask.SUSPEND (default)  ManagedTask.USE_TRANSACTION_OF_EXECUTION_THREAD Overview
  38. 38. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.38 Task Events Notifications  Task lifecycle events notifications via ManagedTaskListener interface methods when task is: – submitted – not able to start or is cancelled – about to start – completed running, either succeeded or failed with exception  Can be used for logging tasks progress  Can be used for remedial actions such as resubmit a failed task Overview
  39. 39. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.39 Task Events Notifications ManagedTaskListener  ManagedTaskListener implementations typically provided by application component  Listeners can be associated with tasks that are submitted to ManagedExecutorService or ManagedScheduledExecutorService  Notification methods are run in unspecified context by default – Can be made contextual with contextual proxy object for ManagedTaskListener
  40. 40. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.40 Task Events Notifications ManagedTaskListener API  void taskSubmitted(Future<?> future, ManagedExecutorService executor, Object task)  void taskStarting(Future<?> future, ManagedExecutorService executor, Object task)  void taskAborted(Future<?> future, ManagedExecutorService executor, Object task, Throwable exception)  void taskDone(Future<?> future, ManagedExecutorService executor, Object task, Throwable exception)
  41. 41. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.41 Task Events Notifications Registering ManagedTaskListener // Runnable implements ManagedTask public class TaskWithListener implements Runnable, ManagedTask { ... public ManagedTaskListener getManagedTaskListener() { return aManagedTaskListener; } } //use ManagedExecutors utility to associate a ManagedTaskListener to a task Runnable aTask; ManagedTaskListener myTaskListner; Runnable taskWithListener = ManagedExecutors.managedTask(aTask, myTaskListener); ... ManagedExecutorService executor = ...; executor.submit(taskWithListener);
  42. 42. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.42 ManagedTask Overview  Any task submitted to an ManagedExecutorService or an ManagedScheduledExecutorService can optionally implement ManagedTask  Provides – Identifying information about the task – ManagedTaskListener for lifecycle events notification – Any additional execution properties
  43. 43. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.43 ManagedTask API  API – Map<String, String> getExecutionProperties() – ManagedTaskListener getManagedTaskListener()  Execution properties – LONGRUNNING_HINT – IDENTITY_NAME – TRANSACTION  SUSPEND  USE_TRANSACTION_OF_EXECUTION_THREAD
  44. 44. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.44 ManagedExecutors Overview  Utility class in javax.enterprise.concurrent package  Provided by Java EE for use by application components  Contains methods for – Testing whether current thread is a ManageableThread that has been marked for shutdown – Creating a ManagedTask that connects the given Callable/Runnable with a given ManagedTaskListener and with any given execution properties
  45. 45. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.45 ManagedExecutors API  public static boolean isCurrentThreadShutdown()  public static Runnable managedTask(Runnable task, ManagedTaskListener taskListener) throws IllegalArgumentException  public static Runnable managedTask(Runnable task, Map<String,String> executionProperties, ManagedTaskListener taskListener) throws IllegalArgumentException  public static <V> Callable<V> managedTask(Callable<V> task, ManagedTaskListener taskListener) throws IllegalArgumentException  public static <V> Callable<V> managedTask(Callable<V> task, Map<String,String> executionProperties, ManagedTaskListener taskListener) throws IllegalArgumentException
  46. 46. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.46 Program Agenda  Overview  Managed Objects  Features  Summary  Resources
  47. 47. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.47 Summary  Provides asynchronous capabilities to Java EE application components  Allows Java SE developers simple migration path to Java EE  Provides managed objects to applications for submitting tasks and obtaining managed threads  Features such as propagation of container context  Java EE application developers now have tools to have more advanced control of asynchronous processing
  48. 48. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.48 Program Agenda  Overview  Managed Objects  Features  Summary  Resources
  49. 49. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.49 Resources  Spec and API docs – http://jcp.org/en/jsr/detail?id=236 – http://docs.oracle.com/javaee/7/api – http://concurrency-ee-spec.java.net  Java EE 7 SDK – http://www.oracle.com/javaee  Please send feedback to – users@concurrency-ee-spec.java.net
  50. 50. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.50
  51. 51. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.51 Graphic Section Divider

×