簡體   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