即使在使用 DelegatingSecurityContextAsyncTaskExecutor 之后,Spring 上下文也没有得到更新

Posted

技术标签:

【中文标题】即使在使用 DelegatingSecurityContextAsyncTaskExecutor 之后,Spring 上下文也没有得到更新【英文标题】:Spring context is not getting updated even after using DelegatingSecurityContextAsyncTaskExecutor 【发布时间】:2021-07-25 03:48:49 【问题描述】:

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

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

@豆 公共 DelegatingSecurityContextAsyncTaskExecutor taskExecutor(ThreadPoolTask​​Executor 委托) 返回新的 DelegatingSecurityContextAsyncTaskExecutor(delegate);

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

【问题讨论】:

【参考方案1】:

首先:您不应该将MODE_INHERITABLETHREADLOCAL 与池线程一起使用(要了解更多信息,请阅读this)

第二:根据我的经验,将DelegatingSecurityContextAsyncTaskExecutor 定义为@Bean 是行不通的。仍将使用默认执行器。

您需要从AsyncConfigurer 接口扩展您的@EnableAsync @Configuration 并实现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);
    

【讨论】:

以上是关于即使在使用 DelegatingSecurityContextAsyncTaskExecutor 之后,Spring 上下文也没有得到更新的主要内容,如果未能解决你的问题,请参考以下文章

颤振:即使使用了`provider`,小部件仍在重建

即使在使用 await [重复] 之后,Javascript 也难以使用承诺值

CGImageRef 即使在释放后也会使用大量内存

即使在使用属性 multiple = false 不起作用后也禁用多个文件选择

即使使用 Junit 4 框架在 selenium 中断言语句失败也继续执行 [重复]

Python Turtle.Terminator 即使在使用 exitonclick() 之后