ホームページ > Java > &#&チュートリアル > 非同期タスク実行でリクエストスコープを有効にする方法は?

非同期タスク実行でリクエストスコープを有効にする方法は?

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

How to Enable Request Scope in Asynchronous Task Execution?

非同期タスク実行でのリクエスト スコープの有効化

問題:

非同期 Web サービスは次のことを行う必要があります。非同期処理内のリクエスト スコープの Bean、特に @Scope(value = WebApplicationContext.SCOPE_REQUEST) のアノテーションが付けられた Bean にアクセスします。ただし、SimpleAsyncTaskExecutor はスレッド バインドされたリクエスト属性を保持しないため、例外が発生します。

解決策:

非同期タスク実行でリクエスト スコープを有効にするには、カスタム TaskPoolExecutor が作成されます。バックグラウンド スレッドのリクエスト コンテキストを保存およびクリアする特別な Cal​​lable も伴います。

実装:

カスタム エグゼキュータ:

<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>
ログイン後にコピー

使用法:

<code class="java">taskExecutor.execute(new ContextAwareCallable(new Runnable() {
    @Override
    public void run() {
        asyncRequest(request);
    }
}), RequestContextHolder.currentRequestAttributes());</code>
ログイン後にコピー

注:

  • このメソッドは、セキュリティ コンテキストではなく、リクエスト スコープとセッション スコープのみをサポートします。
  • と互換性があります。 Callable インターフェイスと Runnable インターフェイスの両方。

以上が非同期タスク実行でリクエストスコープを有効にする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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