EJB 3.1 - Обработка исключений в асинхронных заданиях - PullRequest
1 голос
/ 28 июля 2010

У меня есть несколько асинхронных заданий, для которых я хотел бы прозрачно обработать исключение.Я хотел бы поместить логику обработки исключений в другой компонент / класс.В Seam 2 я расширил класс обработчика исключений.

Например, я хотел бы вызвать событие с исключением в нем, чтобы я мог иметь несколько компонентов, действующих по своему усмотрению.Наиболее распространенным является тот, который уведомляет администраторов.

Спасибо,

Вальтер

1 Ответ

1 голос
/ 28 июля 2010

Вот пример из Часть третья: новые функции в EJB 3.1 , которые вы, вероятно, можете адаптировать:

Асинхронный вызов сессионных компонентов

Асинхронная обработка удивительно распространенное требование много корпоративных приложений. Некоторые из наиболее очевидные случаи использования вызывая фон огня и забывай процессы, обработка долгосрочных задач сохраняя пользовательский интерфейс восприимчивый или просто увеличивающийся Пропускная способность приложения с помощью Преимущества параллельной обработки. Самый простой способ реализации асинхронная обработка в Java EE приложения сегодня используют сообщение Фасоль На самом деле, первый Пример управляемого сообщениями компонента EJB 3 в действии используется для реализации асинхронный порядок выставления счетов. Больше точно, бин, управляемый сообщениями (OrderBillingMDB) асинхронно выставляет счет клиенту после заказа подтвердил и обновил заказ информация с результатами попытка выставления счета, как только она будет завершена. На рисунке 1 показан этот сценарий:

alt text

Рисунок 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> тем не мение. Асинхронный вызов поддерживает несколько других полезных функций как гарантии доставки и транзакция отправки семантики. За подробности, ознакомьтесь с черновиком спецификации.

Если у вас есть конкретная проблема, пожалуйста, задайте более конкретный вопрос:)

Смотри также

...