Spring の非同期タスクでリクエストスコープの Bean にアクセスするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-03 04:25:02
オリジナル
923 人が閲覧しました

 How Can I Access Request-Scoped Beans in Asynchronous Tasks in Spring?

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

Web アプリケーションでは、通常、リクエストは DispatcherServlet または DispatcherPortlet のスコープ内で処理されます。ただし、AsyncTaskExecutor を使用するなど、タスクが非同期で実行される場合、リクエスト スコープは使用できなくなります。これにより、非同期タスクでリクエスト スコープの Bean にアクセスしようとすると例外が発生する可能性があります。

問題:

この問題を解決するには、有効にする方法を見つける必要があります。非同期タスクエグゼキューター内のリクエストスコープ。

解決策:

1 つのアプローチには、タスクとともにリクエスト スコープ情報を保存するカスタム エグゼキューターを作成することが含まれます。その方法は次のとおりです:

  1. カスタム タスク プール エグゼキュータの作成:

    <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>
    ログイン後にコピー
  2. コンテキスト認識呼び出し可能オブジェクトの作成:

    <code class="java">public class ContextAwareCallable<T> implements Callable<T> {
        // ...
        @Override
        public T call() throws Exception {
            // Set the request context for the background thread
            // ...
            try {
                return task.call();
            } finally {
                // Reset the request context
                // ...
            }
        }
    }</code>
    ログイン後にコピー
  3. Executor 構成のオーバーライド:

    <code class="java">@Configuration
    public class ExecutorConfig extends AsyncConfigurerSupport {
        @Override
        @Bean
        public Executor getAsyncExecutor() {
            return new ContextAwarePoolExecutor();
        }
    }</code>
    ログイン後にコピー

このカスタム エグゼキュータを使用すると、リクエスト スコープ情報にアクセスできるタスクを送信できます。これにより、スコープ関連の例外が発生することなく、非同期タスクでリクエスト スコープの Bean を使用できるようになります。

注:

このアプローチは、セッション スコープとリクエスト スコープの Bean にのみ適用されます。 。セキュリティ コンテキスト (Spring Security など) の場合、バックグラウンド スレッドでコンテキストを設定するために別のメソッドを実装する必要がある場合があります。

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

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