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