Асинхронный вызов сессионных компонентов
Асинхронная обработка
удивительно распространенное требование
много корпоративных приложений. Некоторые из
наиболее очевидные случаи использования
вызывая фон огня и забывай
процессы, обработка долгосрочных задач
сохраняя пользовательский интерфейс
восприимчивый или просто увеличивающийся
Пропускная способность приложения с помощью
Преимущества параллельной обработки.
Самый простой способ реализации
асинхронная обработка в Java EE
приложения сегодня используют сообщение
Фасоль На самом деле, первый
Пример управляемого сообщениями компонента EJB 3
в действии используется для реализации
асинхронный порядок выставления счетов. Больше
точно, бин, управляемый сообщениями
(OrderBillingMDB
) асинхронно
выставляет счет клиенту после заказа
подтвердил и обновил заказ
информация с результатами
попытка выставления счета, как только она будет завершена.
На рисунке 1 показан этот сценарий:
Рисунок 1: Асинхронное выставление счетов за заказ
При использовании Message Driven Beans для
асинхронная обработка конечно
работает, это также заставляет вас иметь дело с
обмен сообщениями и JMS, даже для относительно
легкая функциональность. Это
именно проблема асинхронная
вызов сессионного компонента предназначен для
решать. С этим улучшением вы можете
сделать асинхронную обработку просто
аннотируя метод сессионного компонента с
@Asynchronous
аннотация. Давайте
взгляните на переработанный EJB 3
в примере Action для асинхронного
биллинг с использованием функции:
@Stateless
public class OrderBillingServiceBean implements OrderBillingService {
...
@Asynchronous
public void billOrder(Order order) {
try {
// Attempt to charge the order.
bill(order);
// Send email notification of billing success.
notifyBillingSuccess(order);
order.setStatus(OrderStatus.COMPLETE);
} catch (BillingException be) {
// Send email notification of billing failure.
notifyBillingFailure(be, order);
order.setStatus(OrderStatus.BILLING_FAILED);
} finally {
update(order);
}
}
...
}
Из-за @Asynchronous
аннотация, когда клиент вызывает
OrderBillingService.billOrder
метод, вызов вернется
сразу вместо блокировки до
billOrder
метод заканчивается
выполнения. Контейнер EJB сделает
уверен, что метод выполняется
асинхронно (возможно, используя
обмен сообщениями под капотом). Как вы можете
видите, тип возвращаемого значения
Асинхронный метод недействителен. Это будет
вероятно, дело в огромном
большинство асинхронных сессионных компонентов
методы. Тем не менее, EJB 3.1 также может
поддерживать тип возврата
java.util.concurrent.Future<V>
,
где V
представляет результирующий
значение асинхронного вызова.
Если вы не знакомы с этим,
Future<V>
интерфейс позволяет
делать такие вещи, как отмена
асинхронный вызов, проверка
вызов завершен, проверьте
исключения и получение результатов
асинхронный вызов. Проверять, выписываться
документация для Future<V>
интерфейс здесь:
http://java.sun.com/javase/6/docs/api/java/util/concurrent/Future.html.
Давайте кратко рассмотрим пример
используя тип возврата Future. В
billOrder
метод в предыдущем
Например, мы устанавливаем статус
порядок в зависимости от результатов
Попытка выставить счет и обновить заказ.
Предположим, что обновитель invoker
порядок сами и хотят знать
какой статус попытки биллинга
было. Мы могли бы сделать это путем рефакторинга
billOrder
метод следующим образом:
@Stateless
public class OrderBillingServiceBean implements OrderBillingService {
...
@Asynchronous
public Future<OrderStatus> billOrder(Order order) {
try {
// Attempt to charge the order.
bill(order);
// Send email notification of billing success.
notifyBillingSuccess(order);
return new AsyncResult<OrderStatus>(OrderStatus.COMPLETE);
} catch (BillingException be) {
// Send email notification of billing failure.
notifyBillingFailure(be, order);
return new AsyncResult<OrderStatus>
(OrderStatus.BILLING_FAILED);
}
}
...
}
Объект javax.ejb.AsyncResult<V>
это удобная реализация
Future<V>
интерфейс. Требуется
результат асинхронного вызова
в качестве аргумента конструктора. Там в
ничто не мешает вам использовать ваш
собственная реализация Future<V>
тем не мение. Асинхронный вызов
поддерживает несколько других полезных функций
как гарантии доставки и
транзакция отправки семантики. За
подробности, ознакомьтесь с черновиком спецификации.
Если у вас есть конкретная проблема, пожалуйста, задайте более конкретный вопрос:)