Асинхронное взаимодействие

Содержание

Слайд 2

АСИНХРОННЫЕ ВЫЗОВЫ

АСИНХРОННЫЕ ВЫЗОВЫ

Слайд 3

Execution framework (java.util.concurrent)

A task that returns a result and may throw an

Execution framework (java.util.concurrent) A task that returns a result and may throw
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 {

Execution framework (java.util.concurrent) ScheduledExecutorService : Executors.newScheduledThreadPool(int corePoolSize) newSingleThreadScheduledExecutor() ExecutorService: Executors.newCachedThreadPool() Executors.newSingleThreadExecutor Executors.newFixedThreadPool(int
Future submit(Callable task);
Future take() throws InterruptedException;
Future poll();

}
Implementation: ExecutorCompletionService(Executor executor)

Слайд 5

Сравнение производительности

Cинхронный сервлет (веб-сервис), ожидание 10 сек
Сервлет исполняется 10 сек и удерживает

Сравнение производительности Cинхронный сервлет (веб-сервис), ожидание 10 сек Сервлет исполняется 10 сек
все это время свой поток а в пуле 200 потоков, то нагрузка 200/10 сек = 20 запросов/ сек.

Слайд 6

Сравнение производительности

Асинхронный сервлет, ожидание10 сек (GlassFish  v3, ScheduledExecutorService)
Нагрузка- примерно 500 запросов/сек. (возможно

Сравнение производительности Асинхронный сервлет, ожидание10 сек (GlassFish v3, ScheduledExecutorService) Нагрузка- примерно 500
ограничение на стороне 1 клиента)
При длительности в 10 с и 200 потоках в пуле – выигрыш в 25 раз

Слайд 7

АСИНХРОННЫЕЙ КЛИЕНТ В GLASSFISH

АСИНХРОННЫЕЙ КЛИЕНТ В GLASSFISH

Слайд 8

Glassfish асинхронный клиент веб-сервиса

wsimport

wsimport -b async.xml

true

@WebMethod
@RequestWrapper(localName=..
@ResponseWrapper(localName =“Result”, ..
public

Glassfish асинхронный клиент веб-сервиса wsimport wsimport -b async.xml true @WebMethod @RequestWrapper(localName=.. @ResponseWrapper(localName
Response execute();
public Future execute(
@WebParam(name = "asyncHandler", targetNamespace = "")
AsyncHandler asyncHandler);

Слайд 9

Glassfish асинхронный клиент веб-сервиса

Пример

public interface Response extends Future {
Map getContext();
}
public interface AsyncHandler {

Glassfish асинхронный клиент веб-сервиса Пример public interface Response extends Future { Map
void handleResponse(Response res);
}
final AsyncHandler handler = new AsyncHandler() {
@Override
public void handleResponse(Response res) {
res.get() ….
}

Слайд 10

Glassfish асинхронный клиент веб-сервиса

+ есть в Metro 2.1 (Glassfish 2)
+ достаточно прост и

Glassfish асинхронный клиент веб-сервиса + есть в Metro 2.1 (Glassfish 2) +
удобен в реализации
+ генерируется из wsdl, возможно выборочное применение к разным методам.

Слайд 11

Glassfish асинхронный клиент веб-сервиса @Oneway

Пример





@Oneway

Glassfish асинхронный клиент веб-сервиса @Oneway Пример @Oneway @WebMethod public void execute() no exceptions
@WebMethod
public void execute() no exceptions

Слайд 12

Glassfish асинхронный клиент веб-сервиса @Oneway

+ есть в Metro 2.1 (Glassfish 2)
+@Oneway очень прост

Glassfish асинхронный клиент веб-сервиса @Oneway + есть в Metro 2.1 (Glassfish 2)
в использовании (просто возвращается акноледж- статус код 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

Glassfish v3 асинхронный клиент EJB @Remote public interface IAsyncEJB { @Asynchronous public
class AsyncEJB implements IAsyncEJB {
@Asynchronous
public Future execute() throws Exception{
...
return new AsyncResult(res);
}
}

Слайд 14

Glassfish v3 асинхронный клиент EJB

- появились только в EJB 3.1 (Glassfish v3)
-недоступны как

Glassfish v3 асинхронный клиент EJB - появились только в EJB 3.1 (Glassfish
веб-сервисы
-неудобны в использовании (возвращается удаленная реализация Future)
-при нагрузке работали очень задумчиво

Слайд 15

АСИНХРОННАЯ РЕАЛИЗАЦИЯ СЕРВИСА В GLASSFISH

АСИНХРОННАЯ РЕАЛИЗАЦИЯ СЕРВИСА В GLASSFISH

Слайд 16

Glassfish низкоуровневая реализация веб-сервиса

@WebService
public class AsyncWebService implements AsyncProvider {
public void invoke(final Source

Glassfish низкоуровневая реализация веб-сервиса @WebService public class AsyncWebService implements AsyncProvider { public
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)
+ большая гибкость в

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

Glassfish v3 асинхронные сервлеты @WebServlet(urlPatterns = {"/async"}, asyncSupported = true) public class
{
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;
}
Имя файла: Асинхронное-взаимодействие.pptx
Количество просмотров: 147
Количество скачиваний: 0