ホームページ > Java > &#&チュートリアル > 非同期タスクでリクエストのスコープを維持するにはどうすればよいですか?

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

Barbara Streisand
リリース: 2024-11-03 07:51:03
オリジナル
1015 人が閲覧しました

How Can I Maintain Request Scope in Asynchronous Tasks?

非同期タスクでのリクエスト スコープの維持

Web アプリケーションでは、リクエストを受信した後に非同期タスクを実行するのが一般的です。ただし、これらのタスクが @Scope(value = WebApplicationContext.SCOPE_REQUEST) アノテーションが付けられたオブジェクトなど、リクエスト固有のオブジェクトに確実にアクセスできるようにするのは困難な場合があります。

非ブロック的な方法でリクエストを処理する場合、デフォルトの SimpleAsyncTaskExecutor はリクエスト スレッドのスコープにアクセスできないため、「現在のスレッドではスコープ 'request' がアクティブではありません。」のような例外が発生します。

この問題に対処するために、カスタム ContextAwarePoolExecutor を作成できます。このエグゼキュータはタスクのリクエスト コンテキスト情報を保存し、ContextAwareCallable を利用してバックグラウンド スレッドに必要なコンテキストを設定およびクリアします。

カスタム エグゼキュータの実装:

<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;

    public ContextAwareCallable(Callable<T> task, RequestAttributes context) {
        this.task = task;
        this.context = 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>
ログイン後にコピー

このカスタム エグゼキュータを利用することで、非同期タスクはリクエストにシームレスにアクセスできます。スコープ付きオブジェクト。デフォルトの SimpleAsyncTaskExecutor.

の制限を克服します。

以上が非同期タスクでリクエストのスコープを維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート