Maison > Java > javaDidacticiel > Comment puis-je accéder aux beans à portée de requête dans les tâches asynchrones au printemps ?

Comment puis-je accéder aux beans à portée de requête dans les tâches asynchrones au printemps ?

Linda Hamilton
Libérer: 2024-11-03 04:25:02
original
988 Les gens l'ont consulté

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

Activation de la portée des requêtes dans l'exécution de tâches asynchrones

Dans les applications Web, les requêtes sont généralement traitées dans le cadre d'un DispatcherServlet ou d'un DispatcherPortlet. Cependant, lorsque les tâches sont exécutées de manière asynchrone, par exemple à l'aide d'un AsyncTaskExecutor, la portée de la requête devient indisponible. Cela peut entraîner des exceptions lors de la tentative d'accès aux beans de portée requête dans des tâches asynchrones.

Problème :

Pour résoudre ce problème, vous devez trouver un moyen d'activer la portée de la demande dans l’exécuteur de tâches asynchrone.

Solution :

Une approche consiste à créer un exécuteur personnalisé qui stocke les informations sur la portée de la demande avec les tâches. Voici comment procéder :

  1. Créer un exécuteur de pool de tâches personnalisé :

    <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>
    Copier après la connexion
  2. Créer un contexte Appelable :

    <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>
    Copier après la connexion
  3. Remplacer la configuration de l'exécuteur :

    <code class="java">@Configuration
    public class ExecutorConfig extends AsyncConfigurerSupport {
        @Override
        @Bean
        public Executor getAsyncExecutor() {
            return new ContextAwarePoolExecutor();
        }
    }</code>
    Copier après la connexion

En utilisant cette personnalisation exécuteur, vous pouvez soumettre des tâches qui ont accès aux informations sur la portée de la demande. Cela vous permet d'utiliser des beans de portée requête dans vos tâches asynchrones sans rencontrer d'exceptions liées à la portée.

Remarque :

Cette approche s'applique uniquement aux beans de portée session et requête. . Pour le contexte de sécurité (par exemple, Spring Security), vous devrez peut-être implémenter une méthode différente pour définir le contexte dans le fil d'arrière-plan.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal