Асинхроный EJB

Одной из новых возможностей, представленных в Enterprise Java Beans 3.1 (JSR 318) асинхронный вызов бизнес-методов. Это позволяет контролировать, выполнение серверной части приложения независимо от клиентской. Асинхронные операции могут вернуть "Future <T>", которые позволяют клиенту получить результирующее значение, проверить исключения, или попытаться отменить любой незавершенный вызовов.

Для реализации асинхронности стоит использовать аннотацию @Asynchronous.

Рассмотрим следующий пример:

@Stateless
@Asynchronous
public class SimpleAsyncEJB {

    public Future<Integer> 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<Integer> 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
Урок создан: 05 ноября 2012 | Просмотров: 5416 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

Комментариев пока нет, будьте первым.