繁体   English   中英

Spring 引导:无法访问 Spring 调度程序中的请求 scope bean

[英]Spring Boot: Unable to access the request scope bean in Spring Scheduler

在我的 Spring 启动应用程序中,我有一个每隔一小时执行一次的调度程序任务。 在尝试访问请求范围 bean 的调度程序方法中。 总是得到异常org.springframework.beans.factory.BeanCreationException

这是代码示例。

@Data
public class TestVo {
  private String message = "Hello";
}

@Bean
@Scope(value="request", proxyMode=ScopedProxyMode.TARGET_CLASS)
public TestVo testVo() {
    return new TestVo();
}

在调度程序方法中访问上面创建的 bean,如下所示,

@Autowired
private TestVo testVo;

@Scheduled(cron="0 0 * * * *")
public void greetings() {
  System.out.println(testVo.getMessage()); // accessing request scope bean
}

使用上述代码获得以下异常,

org.springframework.beans.factory.BeanCreationException:创建名为'scopedTarget.scheduledJobTaskExecutor'的bean时出错:Scope'request'对于当前线程无效; 如果您打算从 singleton 引用它,请考虑为此 bean 定义一个范围代理; 嵌套异常是 java.lang.IllegalStateException:未找到线程绑定请求:您是指实际 web 请求之外的请求属性,还是在原始接收线程之外处理请求? 如果您实际上是在 web 请求中操作并且仍然收到此消息,则您的代码可能在 DispatcherServlet 之外运行:在这种情况下,使用 RequestContextListener 或 RequestContextFilter 来公开当前请求。

会有帮助的..谢谢。

请求范围的 bean 绑定到特定的请求。 每次请求到来时,都会创建一个新实例,并在请求完成后将其销毁。 请求绑定到一个线程并使用该线程来处理请求(在非反应环境中)。 即使有可能,调度程序也不知道在这种情况下应该使用哪个请求 object。 假设您在计划作业开始运行时有 100 个活动请求,应该如何选择一个? 或者如果没有任何活动请求(所以上下文没有实例保存?)。 您可以通过代理将请求 scope 注入到 singleton 中,因为 singleton 方法调用将在同一个请求线程上处理,但计划的作业使用它自己的线程池,它不绑定到任何请求。 也许现在您可以在调度程序中使用请求范围的 bean 看到问题。 如果您想在调度程序和请求范围的 bean 中使用相同的逻辑,您可以例如将其提取到超类中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM