在 Web 應用程式中,要求通常在 DispatcherServlet 或 DispatcherPortlet 的範圍內處理。但是,當任務非同步執行時(例如使用 AsyncTaskExecutor),請求範圍將變得不可用。當嘗試在非同步任務中存取請求範圍的 beans 時,這可能會導致異常。
問題:
要解決此問題,您需要找到一種方法來啟用非同步任務執行器內的請求範圍。
解決方案:
一種方法涉及建立一個自訂執行器,用於儲存請求範圍資訊和任務。具體操作方法如下:
建立自訂任務池執行器:
<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> { // ... @Override public T call() throws Exception { // Set the request context for the background thread // ... try { return task.call(); } finally { // Reset the request context // ... } } }</code>
覆蓋執行器設定:
<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
以上是如何在 Spring 的非同步任務中存取請求範圍的 Bean?的詳細內容。更多資訊請關注PHP中文網其他相關文章!