Динамически установите размер пула потоков для CompletionStages в игре! с Аккой

В своем веб-приложении я использую Play! фреймворк, основанный на Akka для управления потоками. В конкретном случае, когда я составляю много CompletionStages, которые собирают данные от внешних служб, я хочу контролировать количество параллельных запросов, чтобы не перегружать эти внешние службы. Один из способов сделать это без изменения всего приложения - контролировать размер пула потоков, который использует Akka. Теперь я подготовил два пула потоков в akka like и попытался переключиться между двумя пулами. Я составляю свои CompletionStages, используя что-то вроде этого:

CompletableFuture.completedFuture(firstResult)
                        .thenComposeAsync( firstResult -> { dostuff(firstResult);}

Согласно Akka документация, вот как установить текущий пул потоков:

// this is scala.concurrent.ExecutionContext
// for use with Futures, Scheduler, etc.
final ExecutionContext ex = system.dispatchers().lookup("my-dispatcher");

Наблюдая за моим приложением, установка такого контекста не влияет на приложение, и рассматривается только диспетчер по умолчанию. Есть ли способ динамически установить размер текущего пула в Akka?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
238
1

Ответы 1

Вам необходимо передать свой собственный Executor методу thenComposeAsync:

final java.util.concurrent.Executor exec = system.dispatchers().lookup("my-dispatcher");

CompletableFuture.completedFuture(firstResult)
                 .thenComposeAsync(firstResult -> {
                   dostuff(firstResult);
                 }, exec);

Другие вопросы по теме