1

我在 spring 上下文中遇到了一些问题,在阅读了所有文章之后,它确实变得更加混乱。所以,这是我的用例:

我有一个正在运行的应用程序,它需要在请求中传递用户的身份验证令牌才能在我将在后台运行的进程中使用它。此令牌用于进行 rest api 调用。起初,我们手动创建新线程并传递上下文,我对 spring 上下文使用 MODE_INHERITABLETHREADLOCAL 策略。但在最新版本中,我们开始使用线程池。它在部署后工作,但令牌在某个点之后变得无效,因为线程没有获得最新的上下文。我阅读了文章并开始使用 DelegatingSecurityContextAsyncTaskExecutor,如下所示:

@Bean public DelegatingSecurityContextAsyncTaskExecutor taskExecutor(ThreadPoolTask​​Executor delegate) { return new DelegatingSecurityContextAsyncTaskExecutor(delegate); }

但是我今天检查时仍然遇到同样的问题。现在明天我可能会收到来自测试员的邮件,其中包含失败的测试用例。我想补充一点,我仍然使用 MODE_INHERITABLETHREADLOCAL 作为策略以及 DelegatingSecurityContextAsyncTaskExecutor。请帮帮我。

4

1 回答 1

0

第一:您不应该MODE_INHERITABLETHREADLOCAL与池线程一起使用(要了解更多信息,请阅读内容)

第二:根据我的经验,将其定义DelegatingSecurityContextAsyncTaskExecutor@Bean无效。仍将使用默认执行程序。

您需要扩展您的@EnableAsync @Configurationfrom AsyncConfigurerinterface 并实现getAsyncExecutor,而不是使用@Bean. 工作示例:

@EnableAsync
@Configuration
public class AsyncConfig implements AsyncConfigurer {
    private final ThreadPoolTaskExecutor defaultSpringBootAsyncExecutor;

    public AsyncConfig(ThreadPoolTaskExecutor defaultSpringBootAsyncExecutor) {
        this.defaultSpringBootAsyncExecutor = defaultSpringBootAsyncExecutor;
    }

    @Override
    public Executor getAsyncExecutor() {
        return new DelegatingSecurityContextAsyncTaskExecutor(defaultSpringBootAsyncExecutor);
    }
}
于 2021-07-26T08:25:29.130 回答