Асинхроный EJB – Devcolibri – Android для начинающих

Асинхроный 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

ПОХОЖИЕ ПУБЛИКАЦИИ

    None Found

10399
05/11/2012

0 комментариев к статье "Асинхроный EJB"

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

Сайт использует cookie-файлы для того, чтобы вам было удобнее им пользоваться. Для продолжения работы с сайтом, вам необходимо принять использование cookie-файлов.

Я ознакомлен(а)