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

DDD
リリース: 2024-10-31 21:59:02
オリジナル
787 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!