Количество потоков продолжает увеличиваться при использовании ManagedExecutor для асинхронных вызовов в QuarkusJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Количество потоков продолжает увеличиваться при использовании ManagedExecutor для асинхронных вызовов в Quarkus

Сообщение Anonymous »

Я работаю над приложением Quarkus, в котором выполняю асинхронные задачи, используя два разных экземпляра ManagedExecutor: один для полного распространения контекста, а другой — без распространения контекста. Однако я заметил, что количество потоков продолжает увеличиваться с каждым вызовом метода.
@Inject
@NamedInstance("no-context-propagation")
ManagedExecutor limitedContextExecutor;

@Inject
@NamedInstance("full-context-propagation")
ManagedExecutor fullContextExecutor;

public List processItems(String identifier, String userId) {
if (userSession.isUserType()) {
identifier = userService.getUserPrimaryData().getIdentifier().toString();
}

List itemEntities = fetchItemEntities(identifier);
if (itemEntities.isEmpty()) {
return List.of();
}

List itemIds = itemEntities.stream()
.map(ItemEntity::getItemId)
.collect(Collectors.toList());

CompletableFuture detailEntitiesFuture = executeAsync(
() -> fetchDetailEntities(itemIds, true), false);

CompletableFuture userDataFuture = executeAsync(
() -> retrieveUserData(userId), true);

Map detailsByItemId = groupEntitiesById(
detailEntitiesFuture.join(), DetailEntity::getItemId);

UserData userData = userDataFuture.join();

// Map results
List resultObjects = mapItems(
itemEntities,
detailsByItemId,
userData);

// Sort results based on some criteria
return sortResultsByCriteria(resultObjects);
}

private CompletableFuture executeAsync(Supplier supplier, boolean propagateContext) {
ManagedExecutor executor = propagateContext ? fullContextExecutor : limitedContextExecutor;
return executor.supplyAsync(supplier);
}

Я использую следующий ManagedExecutorProducer:
@ApplicationScoped
public class ManagedExecutorProducer {

@Produces
@NamedInstance("full-context-propagation")
public ManagedExecutor createFullContextExecutor() {
return ManagedExecutor.builder()
.propagated(ThreadContext.ALL_REMAINING)
.maxAsync(10)
.build();
}

@Produces
@NamedInstance("no-context-propagation")
public ManagedExecutor createLimitedContextExecutor() {
return ManagedExecutor.builder()
.propagated(ThreadContext.NONE)
.maxAsync(10)
.build();
}
}

Проблема:
Каждый раз, когда вызывается процессItems, я вижу, что количество потоков постоянно увеличивается и не освобождается должным образом.
Что может быть причиной постоянного увеличения количества потоков? Как я могу гарантировать, что потоки будут использоваться повторно, а не создавать новые потоки?
Есть ли какие-нибудь советы о том, что может быть не так с использованием ManagedExecutor? :)
Вот что я вижу в журналах:
INFO [ClassA] (executor-thread-753) {traceId=XXXX, userType=XXXX} Operation completed successfully
INFO [ClassB] (executor-thread-757) {traceId=XXXX, userType=XXXX} Data retrieved from cache
INFO [ClassC] (executor-thread-757) {traceId=XXXX, userType=XXXX} Data processing completed
INFO [ClassB] (executor-thread-759) {traceId=XXXX, userType=XXXX} Data retrieved from cache
INFO [ClassC] (executor-thread-759) {traceId=XXXX, userType=XXXX} Data processing completed
INFO [ClassB] (executor-thread-760) {traceId=XXXX, userType=XXXX} Data retrieved from cache
INFO [ClassC] (executor-thread-760) {traceId=XXXX, userType=XXXX} Data processing completed
INFO [ClassB] (executor-thread-762) {traceId=XXXX, userType=XXXX} Data retrieved from cache
INFO [ClassC] (executor-thread-762) {traceId=XXXX, userType=XXXX} Data processing completed
INFO [ClassB] (executor-thread-763) {traceId=XXXX, userType=XXXX} Data retrieved from cache
INFO [ClassC] (executor-thread-763) {traceId=XXXX, userType=XXXX} Data processing completed


Подробнее здесь: https://stackoverflow.com/questions/790 ... ls-in-quar
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»