Одной из новых возможностей, представленных в Enterprise Java Beans 3.1 (JSR 318)
асинхронный вызов бизнес-методов. Это позволяет контролировать, выполнение серверной части приложения независимо от клиентской. Асинхронные операции могут вернуть "Future <T>"
, которые позволяют клиенту получить результирующее значение, проверить исключения, или попытаться отменить любой незавершенный вызовов.
Для реализации асинхронности стоит использовать аннотацию @Asynchronous
.
Рассмотрим следующий пример:
@Stateless @Asynchronous public class SimpleAsyncEJB { public FutureaddNumbers(int n1, int n2) { Integer result; result = n1 + n2; try { // имитации запросов JPA Thread.currentThread().sleep(2000); } catch (InterruptedException ex) { ex.printStackTrace(); } return new AsyncResult(result); } }
Сигнатура метода возвращает «Future <Integer>» и возвращает тип «AsyncResult (Integer)».
«AsyncResult» представляет собой новый класс введен в EJB 3.1, который описывает результат асинхронного метода в качестве будущего объекта.
Любой новый метод этого класса будет асинхронными.
2 секунды сна имитирует поведение сервера на обработку ответа, который может включать в себя запросы к базе данных или чтение некоторую информацию из файловой системы.
@EJB SimpleAsyncEJB ejb; //Этот бизнес метод может быть вызван в "doGet" методе из сервелата: PrintWriter out = response.getWriter(); try { Futurefuture = ejb.addNumbers(10, 20); print(out, "Client is working ..."); Thread.currentThread().sleep(1000); if (!future.isDone()) { print(out, "Response not ready yet ..."); } print(out, "Client is working again ..."); Thread.currentThread().sleep(1000); if (!future.isDone()) { print(out, "Response not ready yet ..."); } print(out, "Client is still working ..."); Thread.currentThread().sleep(1000); if (!future.isDone()) { print(out, "Response not ready yet ..."); } else { print(out, "Response is now ready"); } Integer result = future.get(); print(out, "The result is: " + result); } catch (InterruptedException ex) { ex.printStackTrace(); } catch (ExecutionException ex) { ex.printStackTrace(); } finally { out.close(); }
Управление возвращается клиенту сразу после вызова метода бизнес логики EJB. Клиенту не стоит ждать обработки на сервере, достаточно вызвать метод который является асинхронным и после его вызова и обработки на сервере он вернет ответ клиенту.
Результат выполнения выше приведенного примера.
1274142978365: Client is working ... 1274142979365: Response not ready yet ... 1274142979365: Client is working again ... 1274142980366: Response not ready yet ... 1274142980366: Client is still working ... 1274142981366: Response is now ready 1274142981366: The result is: 30Ресурс: www.devcolibri.com
Немає коментарів:
Дописати коментар