首頁 > Java > java教程 > 主體

如何在 Spring 的非同步任務中存取請求範圍的 Bean?

Linda Hamilton
發布: 2024-11-03 04:25:02
原創
923 人瀏覽過

 How Can I Access Request-Scoped Beans in Asynchronous Tasks in Spring?

在非同步任務執行中啟用請求範圍

在 Web 應用程式中,要求通常在 DispatcherServlet 或 DispatcherPortlet 的範圍內處理。但是,當任務非同步執行時(例如使用 AsyncTaskExecutor),請求範圍將變得不可用。當嘗試在非同​​步任務中存取請求範圍的 beans 時,這可能會導致異常。

問題:

要解決此問題,您需要找到一種方法來啟用非同步任務執行器內的請求範圍。

解決方案:

一種方法涉及建立一個自訂執行器,用於儲存請求範圍資訊和任務。具體操作方法如下:

  1. 建立自訂任務池執行器:

    <code class="java">public class ContextAwarePoolExecutor extends ThreadPoolTaskExecutor {
        @Override
        public <T> Future<T> submit(Callable<T> task) {
            return super.submit(new ContextAwareCallable(task, RequestContextHolder.currentRequestAttributes()));
        }
    }</code>
    登入後複製
  2. 上下文感知可呼叫:

    <code class="java">public class ContextAwareCallable<T> implements Callable<T> {
        // ...
        @Override
        public T call() throws Exception {
            // Set the request context for the background thread
            // ...
            try {
                return task.call();
            } finally {
                // Reset the request context
                // ...
            }
        }
    }</code>
    登入後複製
  3. 覆蓋執行器設定:

    <code class="java">@Configuration
    public class ExecutorConfig extends AsyncConfigurerSupport {
        @Override
        @Bean
        public Executor getAsyncExecutor() {
            return new ContextAwarePoolExecutor();
        }
    }</code>
    登入後複製

注意:

此方法僅適用於會話和請求範圍的 bean 。對於安全上下文(例如 Spring Security),您可能需要實作不同的方法來在背景執行緒中設定上下文。

以上是如何在 Spring 的非同步任務中存取請求範圍的 Bean?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板