ホームページ  >  記事  >  Java  >  非同期タスク実行でリクエストのスコープを保持するにはどうすればよいですか?

非同期タスク実行でリクエストのスコープを保持するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-31 21:59:02769ブラウズ

How to Preserve Request Scope in Asynchronous Task Execution?

非同期タスク実行でのリクエスト スコープの保持

非同期 Web サービスを利用するアプリケーションでは、サーバーが AsyncTaskExecutor を介して非同期処理を開始するときに確認応答で応答し、次のようになります。リクエストスコープを有効にするために重要です。これは、@Scope(WebApplicationContext.SCOPE_REQUEST) アノテーションが付けられた Bean クラスにアクセスするために不可欠です。

通常、このようなシナリオでは、DispatcherServlet の外部で動作する SimpleAsyncTaskExecutor 内でリクエスト スコープがアクティブでないために例外が発生します。 。この問題を解決するには、次の解決策を検討してください:

  1. カスタム タスク エグゼキュータを作成する: Spring の ThreadPoolTask​​Executor を拡張し、送信されたタスクの実行をインターセプトするカスタム エグゼキュータを定義します。
  2. リクエスト コンテキストのカプセル化: リクエスト コンテキスト情報を使用して、バックグラウンド スレッドでコンテキストを設定およびクリアする特殊な呼び出し可能 (または実行可能) を作成します。
  3. 実行構成のオーバーライド: デフォルトのエグゼキュータ構成をオーバーライドして、カスタム エグゼキュータを利用します。

: このアプローチでは、セッション スコープとリクエスト スコープの 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。