Слайд 3 Execution framework (java.util.concurrent)
A task that returns a result and may throw an
exception public interface Callable { V call() throws Exception; } public interface Runnable { Future represents the result of an asynchronous computation public interface Future { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException } public interface ScheduledFuture extends Delayed, Future { }
Слайд 4 Execution framework (java.util.concurrent)
ScheduledExecutorService : Executors.newScheduledThreadPool(int corePoolSize) newSingleThreadScheduledExecutor() ExecutorService: Executors.newCachedThreadPool() Executors.newSingleThreadExecutor Executors.newFixedThreadPool(int nThreads) BlockingQueue Implementation: LinkedBlockingQueue public interface CompletionService {
Future submit(Callable task); Future take() throws InterruptedException; Future poll(); … } Implementation: ExecutorCompletionService(Executor executor)
Слайд 5 Сравнение производительности
Cинхронный сервлет (веб-сервис), ожидание 10 сек Сервлет исполняется 10 сек и удерживает
все это время свой поток а в пуле 200 потоков, то нагрузка 200/10 сек = 20 запросов/ сек.
Слайд 6 Сравнение производительности
Асинхронный сервлет, ожидание10 сек (GlassFish v3, ScheduledExecutorService) Нагрузка- примерно 500 запросов/сек. (возможно
ограничение на стороне 1 клиента) При длительности в 10 с и 200 потоках в пуле – выигрыш в 25 раз
Слайд 7 АСИНХРОННЫЕЙ КЛИЕНТ В GLASSFISH
Слайд 8 Glassfish
асинхронный клиент веб-сервиса
wsimport
wsimport -b async.xml true @WebMethod @RequestWrapper(localName=.. @ResponseWrapper(localName =“Result”, .. public
Response execute(); public Future> execute( @WebParam(name = "asyncHandler", targetNamespace = "") AsyncHandler asyncHandler);
Слайд 9 Glassfish
асинхронный клиент веб-сервиса
Пример
public interface Response extends Future { Map getContext(); } public interface AsyncHandler {
void handleResponse(Response res); } final AsyncHandler handler = new AsyncHandler() { @Override public void handleResponse(Response res) { res.get() …. }
Слайд 10 Glassfish
асинхронный клиент веб-сервиса
+ есть в Metro 2.1 (Glassfish 2) + достаточно прост и
удобен в реализации + генерируется из wsdl, возможно выборочное применение к разным методам.
Слайд 11 Glassfish
асинхронный клиент веб-сервиса @Oneway
Пример
@Oneway
@WebMethod public void execute() no exceptions
Слайд 12 Glassfish
асинхронный клиент веб-сервиса @Oneway
+ есть в Metro 2.1 (Glassfish 2) +@Oneway очень прост
в использовании (просто возвращается акноледж- статус код 202, который обрабатывается jax-ws) - при необходимости получения результата или Exception необходима реализация callback и его обработки на стороне клиента (передавать url для callback можно в через WS-addressing), либо result polling.
Слайд 13 Glassfish v3
асинхронный клиент EJB
@Remote public interface IAsyncEJB { @Asynchronous public Future execute() throws Exception; } public
class AsyncEJB implements IAsyncEJB { @Asynchronous public Future execute() throws Exception{ ... return new AsyncResult(res); } }
Слайд 14 Glassfish v3
асинхронный клиент EJB
- появились только в EJB 3.1 (Glassfish v3) -недоступны как
веб-сервисы -неудобны в использовании (возвращается удаленная реализация Future) -при нагрузке работали очень задумчиво
Слайд 15 АСИНХРОННАЯ РЕАЛИЗАЦИЯ СЕРВИСА В GLASSFISH
Слайд 16 Glassfish
низкоуровневая реализация веб-сервиса
@WebService public class AsyncWebService implements AsyncProvider { public void invoke(final Source
request, final AsyncProviderCallback callback, final WebServiceContext ctx) { Executor.submit(new Callable() { @Override public Void call() throws Exception { try{ …. // parse request, form result callback.send(result); return null; } catch (Exception e){ callback.sendError(e);
Слайд 17 Glassfish
низкоуровневая реализация веб-сервиса
+ появились в Metro 2.1 (Glassfish v2) + большая гибкость в
использовании - длительность разработки (необходимо реализовать единственный метод invoke - самостоятельно маршалить-унмаршалить запрос-ответ, определять имя операции, делать web.xml и sun-jaxws.xml, отсутствует в GF консоли)
Слайд 18 Glassfish v3
асинхронные сервлеты
@WebServlet(urlPatterns = {"/async"}, asyncSupported = true) public class AsyncServlet extends HttpServlet
{ private static final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); @Override protected void doGet(HttpServletRequest req, HttpServletResponse res) { final AsyncContext ac = req.startAsync(); Executor.submit(new Callable() { @Override public Void call() throws Exception { HttpServletResponse res = (HttpServletResponse) ac.getResponse(); …. ac.complete(); return null; }