Web アプリケーションでは、通常、リクエストは DispatcherServlet または DispatcherPortlet のスコープ内で処理されます。ただし、AsyncTaskExecutor を使用するなど、タスクが非同期で実行される場合、リクエスト スコープは使用できなくなります。これにより、非同期タスクでリクエスト スコープの Bean にアクセスしようとすると例外が発生する可能性があります。
問題:
この問題を解決するには、有効にする方法を見つける必要があります。非同期タスクエグゼキューター内のリクエストスコープ。
解決策:
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>
コンテキスト認識呼び出し可能オブジェクトの作成:
<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>
Executor 構成のオーバーライド:
<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
このカスタム エグゼキュータを使用すると、リクエスト スコープ情報にアクセスできるタスクを送信できます。これにより、スコープ関連の例外が発生することなく、非同期タスクでリクエスト スコープの Bean を使用できるようになります。
注:
このアプローチは、セッション スコープとリクエスト スコープの Bean にのみ適用されます。 。セキュリティ コンテキスト (Spring Security など) の場合、バックグラウンド スレッドでコンテキストを設定するために別のメソッドを実装する必要がある場合があります。
以上がSpring の非同期タスクでリクエストスコープの Bean にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。