- Используется асинхронный контекст.
- Имеются асинхронные продолжения на безе экземпляра
CompletableFuture.
Класс AsyncCompletableFuture
повторяет функциональность java.util.concurrent.CompletableFuture, но позволяет определить исполнитель по умолчанию.
Если исполнитель по умолчанию не определен явно, используется Asynchronizer.commonPool().
Класс AsyncCompletableFuture позволяет установить исполнитель по умолчанию, учитывающий асинхронный контекст
в продолжениях, для которых исполнитель не определен явно, как например, CompletableFuture.thenAcceptAsync(Consumer).
В таких случаях CompletableFuture использует ForkJoinPool.commonPool(), и это может спровоцировать неожиданное
поведение для стороны, которая предоставляет экземпляр будущего. Как минимум, асинхронный контекст не будет доступен
для продолжений, так они создаются с исполнителем, который не копирует контекст.
IAsyncContext context = Asynchronizer.context();
context.setProperty("userId", 123);
...
AsyncCompletableFuture.completedFuture("Привет, ")
// Это продолжение будет иметь тот же контекст
.thenAcceptAsync(result -> {
var userId = context.getProperty("userId");
System.out.println(result + userId); // Вывод: "Привет, 123"
})
.get();