【发布时间】:2016-07-07 01:50:37
【问题描述】:
我在我的 Spring 启动应用程序中使用 OAuth2RestTemplate 并通过它使用一些资源,因为它封装了所有身份验证信息,所以我可以发送请求,而不用担心令牌和其他身份验证内容。
在我并行发送请求之前一切正常。
由于 OAuth2RestTemplate 有一个Session 范围(它是本地的,因为它包含用户的会话相关信息),当我尝试在多线程环境中使用它时,我得到以下异常
org.springframework.beans.factory.BeanCreationException:创建名为“scopedTarget.oauth2ClientContext”的bean时出错:范围 当前线程的“会话”不活动; 如果您打算从单例中引用它,请考虑为该 bean 定义一个作用域代理; 嵌套异常是 java.lang.IllegalStateException: No thread-bound request found: 你指的是请求属性吗 在实际的网络请求之外, 或处理原始接收线程之外的请求?如果您实际上是在 Web 请求中操作并且仍然 收到这条消息, 您的代码可能在 DispatcherServlet/DispatcherPortlet 之外运行:在这种情况下,请使用 RequestContextListener 或 RequestContextFilter 暴露当前 请求。
据我了解,发生这种情况是因为执行代码的这些单独线程没有与会话连接。
我目前找到的唯一解决方案是在代码中手动将会话与新线程绑定,但我不喜欢它。
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
Stream.of(1, 2, 3).parallel().forEach(it -> {
RequestContextHolder.setRequestAttributes(requestAttributes);
//do something
RequestContextHolder.resetRequestAttributes();
});
RequestContextHolder.setRequestAttributes(requestAttributes);
有一个ticket on Spring Jira 讨论了类似的问题,但我仍然希望有一些与 OAuth2RestTemplate 相关的解决方案。
所以我想知道是否有人遇到过这个问题以及你是如何解决的。
【问题讨论】:
标签: multithreading spring-security spring-boot spring-security-oauth2 resttemplate