非同期 Web サービスを利用するアプリケーションでは、サーバーが AsyncTaskExecutor を介して非同期処理を開始するときに確認応答で応答し、次のようになります。リクエストスコープを有効にするために重要です。これは、@Scope(WebApplicationContext.SCOPE_REQUEST) アノテーションが付けられた Bean クラスにアクセスするために不可欠です。
通常、このようなシナリオでは、DispatcherServlet の外部で動作する SimpleAsyncTaskExecutor 内でリクエスト スコープがアクティブでないために例外が発生します。 。この問題を解決するには、次の解決策を検討してください:
注: このアプローチでは、セッション スコープとリクエスト スコープの Bean のみがサポートされ、セキュリティ コンテキスト (例: Spring Security) はサポートされません。 。セキュリティコンテキストの処理については、別の対策を実装する必要があります。
実装例:
Executor:
<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; @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>
以上が非同期タスク実行でリクエストのスコープを保持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。