Java Play Framework Асинхронная операция над тем же объектом

1

Я пытаюсь выполнить операции Async на одном и том же объекте, например, я бы передал List to Promise для выполнения одновременно 3 запросов, в которых каждый запрос при завершении добавляет запрашиваемые результаты в Список и, наконец, результат http возвращает полный список, когда все результаты параллельных запросов Конец.

Взглянув на этот учебник:

https://www.playframework.com/documentation/2.2.x/JavaAsync

Я мог бы сделать что-то вроде этого

    return async(
            promise(new Function0<Integer>() {
                public Integer apply() {
                    firstQuery();
                }
            })
            . promise(new Function0<Integer>() {
                public Integer apply() {
                    return secondQuery();
                }
            })

            .map(new Function<Integer,Result>() {
                public Result apply(Integer i) {
                    Logger.debug("we have got "+i);
                return ok("Got " + i);
                }
            })     
        );

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

Теги:
playframework
asynchronous
concurrency

1 ответ

1
Лучший ответ

Вы можете использовать Promise.sequence для достижения этого

F.Promise<Integer> one, two;
one = F.Promise.promise(new F.Function0<Integer>() {
    @Override public Integer apply() throws Throwable {
        return 20;
    }
});
two = F.Promise.promise(new F.Function0<Integer>() {
    @Override public Integer apply() throws Throwable {
        return 22;
    }
});
return F.Promise.sequence(one, two).map(new F.Function<List<Integer>, Result>() {
    @Override
    public Result apply(List<Integer> integers) throws Throwable {
        int res = integers.get(0) + integers.get(1);
        return ok("The answer is " + res);
    }
});
  • 0
    Если он выполняет запросы к БД, лучше использовать открытую статическую последовательность <A> F.Promise <java.util.List <A >> (scala.concurrent.ExecutionContext ec, F.Promise <A> ... обещания) >> В противном случае он блокирует потоки, предназначенные для обработки запросов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню