понеділок, 5 листопада 2012 р.

Асинхроный EJB

Одной из новых возможностей, представленных в 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

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments