Одной из новых возможностей, представленных в Enterprise Java Beans 3.1 (JSR 318) асинхронный вызов бизнес-методов. Это позволяет контролировать, выполнение серверной части приложения независимо от клиентской. Асинхронные операции могут вернуть "Future <T>", которые позволяют клиенту получить результирующее значение, проверить исключения, или попытаться отменить любой незавершенный вызовов.
Для реализации асинхронности стоит использовать аннотацию @Asynchronous.
Рассмотрим следующий пример:
@Stateless
@Asynchronous
public class SimpleAsyncEJB {
public Future addNumbers(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 {
Future future = 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
Немає коментарів:
Дописати коментар