Maison  >  Article  >  Java  >  Comment activer la portée des requêtes dans l'exécution de tâches asynchrones ?

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

DDD
DDDoriginal
2024-10-31 02:31:02462parcourir

How to Enable Request Scope in Asynchronous Task Execution?

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

Problème :

Les services Web asynchrones doivent accéder aux beans de portée requête dans leur traitement asynchrone, en particulier ceux annotés avec @Scope(value = WebApplicationContext.SCOPE_REQUEST). Cependant, SimpleAsyncTaskExecutor ne conserve pas les attributs de requête liés aux threads, ce qui entraîne des exceptions.

Solution :

Pour activer la portée de la requête dans l'exécution de tâches asynchrones, un TaskPoolExecutor personnalisé est créé ainsi qu'un Callable spécial qui stocke et efface le contexte de la demande pour le fil d'arrière-plan.

Implémentation :

Exécuteur 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>

Appelable contextuel :

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

Remplacement de la configuration :

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

Utilisation :

<code class="java">taskExecutor.execute(new ContextAwareCallable(new Runnable() {
    @Override
    public void run() {
        asyncRequest(request);
    }
}), RequestContextHolder.currentRequestAttributes());</code>

Remarques :

  • Cette méthode ne prend en charge que les étendues de requête et de session, pas les contextes de sécurité.
  • Elle est compatible avec Interfaces appelables et exécutables.

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!

Déclaration:
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