如何在非同步任務執行中維護請求範圍
在Web應用程式中,執行需要使用bean的非同步操作是很常見的與請求範圍。在非同步任務執行中啟用請求範圍可以透過實作自訂任務執行器來實現。
問題:
您擁有在 AsyncTaskExecutor 中啟動處理的非同步 Web 服務。但是,您需要在此處理中存取使用 @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) 註解的類別。但是,您會收到異常,因為請求作用域在 SimpleAsyncTaskExecutor 中未處於作用中。
解決方案:
要在非同步任務執行中啟用請求作用域,我們將實現執行以下步驟:
建立自訂任務執行器:
<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>
實作情境感知可呼叫:
<code class="java">public class ContextAwareCallable<T> implements Callable<T> { private Callable<T> task; private RequestAttributes context; public ContextAwareCallable(Callable<T> task, RequestAttributes context) { this.task = task; this.context = context; } @Override public T call() throws Exception { if (context != null) { RequestContextHolder.setRequestAttributes(context); } try { return task.call(); } finally { RequestContextHolder.resetRequestAttributes(); } } }</code>
設定自訂任務執行器:
<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
說明:
此解決方案適用於會話範圍和請求範圍beans,但不適用於安全上下文。 可以建立並使用可運行的實作來取代execute() 方法的可呼叫實作。
以上是如何在非同步任務執行中存取請求範圍的 bean?的詳細內容。更多資訊請關注PHP中文網其他相關文章!