Служба Spring executor с компонентами Request scope не работает

Этот вопрос был задан, но мы не можем заставить решение работать.


У нас есть класс для использования в качестве класса пользовательских данных. Мы сделали это в bean-области видимости запроса под конфигурацией весны.

    @Bean
    @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public UserContext userContext() {
        return new UserContext();
    }

Наш конфиг исполнителя -

@Override
@Bean
public AsyncTaskExecutor getAsyncExecutor() {
    ThreadPoolTaskExecutor poolExecutor = new ThreadPoolTaskExecutor();
    poolExecutor.setTaskDecorator(new ContextCopyingDecorator());
    poolExecutor.initialize();
    return poolExecutor;
}

И задача декоратора -

public class ContextCopyingDecorator implements TaskDecorator {
private static final Logger logger = LoggerFactory.getLogger(ContextCopyingDecorator.class);

@Nonnull
@Override
public Runnable decorate(@Nonnull Runnable runnable) {
    logger.info("Decorating context: ");

    RequestAttributes context =
            RequestContextHolder.currentRequestAttributes();
    Map<String, String> contextMap = MDC.getCopyOfContextMap();

    return () -> {
        try {
            RequestContextHolder.setRequestAttributes(context);
            RequestContextHolder.setRequestAttributes(context, true);
            MDC.setContextMap(contextMap);

            logger.info("Context: {}", context);
            logger.info("MDC: {}", contextMap);
            runnable.run();
        } finally {
            MDC.clear();
            RequestContextHolder.resetRequestAttributes();
        }
    };
}

}

Но ценности внутри userContext продолжают приходить null, как только выполнение идет внутри другого потока. Мы попробовали несколько подходов, таких как InheritableThreadLocal ввести индивидуальный сеанс inherited-scopeи декоратор задач, как указано выше, но пока безуспешно.

Есть ли способ получить эти данные? Мы что-то упустили? Потому что, в конце концов, нам, возможно, придется использовать ThreadLocal для решения этой проблемы, что не очень хорошее решение, как говорят разные посты.

0 ответов

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