当前位置: 首页 > 知识库问答 >
问题:

Java/Spring MVC:为子线程提供请求上下文

锺离边浩
2023-03-14

这是我的错误:

java.lang.RuntimeException:
org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'scopedTarget.userRightsService': Scope 'request' is not active
for the current thread; consider defining a scoped proxy for this bean if
you intend to refer to it from a singleton; nested exception is 
java.lang.IllegalStateException: Cannot ask for request attribute - 
request is not active anymore!

好了,够清楚了。我试图通过实现这个解决方案来保持请求上下文:

如何在异步任务执行器中启用请求范围

@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class myThread implements Runnable {

  private RequestAttributes context;

  public DataExportThread(RequestAttributes context) {
    this.context = context;
  }

  public void run() {
    RequestContextHolder.setRequestAttributes(context);
final DataExportThread dataExportThread = 
   new myThread(RequestContextHolder.currentRequestAttributes());

final Thread thread = new Thread(myThread);
thread.setUncaughtExceptionHandler((t, e) -> {...});
thread.start();
    null

我已经试过了,但没有成功:

  • 如何在异步任务执行器中启用请求范围

如果有关系:

<org.springframework-version>4.3.4.RELEASE</org.springframework-version>
@Service("userRightsService")
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserRightsService {
  • 为应用程序中的所有线程设置ThreadContext

但是上下文总是空的...

共有1个答案

淳于兴朝
2023-03-14

我无法重现这个问题,因为我不确定如何创建/注入UserrightsService,但我有几个建议,您可以尝试一下。

我想问题是,RequestAttributes在请求结束时无效(这就是为什么异常说不能请求请求属性-请求不再活动),这在任务运行时发生。

相反,您可以尝试在生成线程的地方注入userrightsservice,并将此实例作为参数传递给线程。这样,UserrightsService就可以毫无问题地创建,因为请求应该仍然可用。

 类似资料:
  • 在Kubernetes集群中运行时,我们使用Spring Boot执行器来公开活跃度和就绪endpoint。默认情况下,spring-boot执行器公开默认标准HTTP服务器端口上的endpoint,请求由Tomcat/Jetty服务器接受器和工作线程池提供。我们最近在压力测试过程中遇到了一个问题,工作池中的所有线程都很忙,新的请求都在排队。这导致了在Kubernetes星系团中的pod坠毁,因为

  • 我现在尝试了很多东西,但我似乎错过了一块拼图。故事是这样的:我有一个请求范围的bean,它从HttpServletRequest读取一些SessionContext。此属性在过滤器中设置。因此,当代码在正确的线程上运行时,这是非常好的。 现在我开始使用java 8s的新功能CompletableFuture,我有其中三个功能在请求线程等待结果时并行计算东西。我想做的是提升/移交/传播bean或请求

  • 这部分文档描述了在 Flask 0.7 中的行为,与旧的行为基本一致,但有细小微妙的 差异。 这里推荐先阅读 应用上下文 章节。 深入上下文作用域 比如说你有一个应用函数返回用户应该跳转到的 URL 。想象它总是会跳转到 URL 的 next 参数,或 HTTP referrer ,或索引页: from flask import request, url_for def redirect_url

  • 问题内容: 我正在尝试在Flask应用程序内部的Python中启动新线程。我正在做由请求触发的后台工作,但是我不需要等待工作完成以响应请求。 是否可以在此子威胁中将烧瓶请求设置为传入的请求?原因是,对数据库的查询(在mongoDB前面的mongoengine)上的ACL依赖于请求的用户(它从flask的请求对象中获取它)来查看他们是否有权访问这些对象,并且由于请求是在子线程中不可用。 任何想法将不

  • 我有2个微服务(A和B)。 有一个接受POST请求的endpoint。当用户发出发布请求时,会发生以下情况: 服务A从POST请求正文中获取对象并将其存储在数据库中。 服务A将对象转换为不同的对象。新对象通过泽西HTTP客户端发送到服务B。 步骤 2 发生在我创建的 Java 线程池(Executors.new缓存线程池)上。通过在新线程上执行步骤 2,服务 A 的终结点的响应时间不受影响。 但是

  • 我是新手,我想在我的课上注入上下文和网络(使用改型)。 这是我到目前为止的代码: 这是我的组件: 但是我如何在应用程序类中使用注入器,这是没有意义的