Spring @Async Распространение контекстаJAVA

Программисты JAVA общаются здесь
Anonymous
Spring @Async Распространение контекста

Сообщение Anonymous »

У меня приложение Spring Boot 2.2. Я создал такой сервис, как это: < /p>

Код: Выделить всё

@Async
@PreAuthorize("hasAnyRole('ROLE_PBX')")
@PlanAuthorization(allowedPlans = {PlanType.BUSINESS, PlanType.ENTERPRISE})
public Future saveCDR(Cdr3CXDto cdrRecord) {
log.debug("Current tenant {}", TenantContext.getCurrentTenantId());

return new AsyncResult(auditCdrRepository.save(cdr3CXMapper.cdr3CXDtoToAuditCdr(cdrRecord)));
}
< /code>

Это моя конфигурация @async: < /p>

@Configuration
@EnableAsync
public class AsyncConfiguration implements AsyncConfigurer {

@Override
public Executor getAsyncExecutor() {
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("threadAsync");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.initialize();
return executor;
}
}
< /code>

Использование SecurityContextholder.mode_inheritableThreadLocal < /code> Я вижу, что контекст безопасности передается методу @Async.
В моем мульти-аттестатском приложении я использую Threadlocal, чтобы установить идентификатор арендатора: < /p>

public class TenantContext {
public final static String TENANT_DEFAULT = "empty";
private static final ThreadLocal code = new ThreadLocal();

public static void setCurrentTenantId(String code) {
if (code != null)
TenantContext.code.set(code);
}

public static String getCurrentTenantId() {
String tenantId = code.get();
if (StringUtils.isNotBlank(tenantId)) {
return tenantId;
}
return TENANT_DEFAULT;
}

public static void clear() {
code.remove();
}

}
< /code>

Поскольку Threadlocal связан с потоком, он недоступен в методе @Async. Кроме того, мой пользовательский @planauthorization 
AOP нуждается в том, чтобы выполнить проверку плана арендатора.
Есть ли чистый способ установить TenantContext в любом методе @Async в моем приложении?

Подробнее здесь: https://stackoverflow.com/questions/616 ... nformation

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