@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
Мобильная версия