Dans une application utilisant des services Web asynchrones, où le serveur répond par un accusé de réception tout en commençant le traitement asynchrone via un AsyncTaskExecutor, il devient crucial pour activer la portée de la demande. Ceci est essentiel pour accéder aux classes de bean annotées avec @Scope(WebApplicationContext.SCOPE_REQUEST).
Généralement, dans de tels scénarios, une exception se produit car la portée de la requête n'est pas active dans SimpleAsyncTaskExecutor, qui fonctionne en dehors du DispatcherServlet. . Pour résoudre ce problème, envisagez la solution suivante :
Remarque : Cette approche ne prend en charge que les beans de portée Session et Demande, et non le contexte de sécurité (par exemple, Spring Security). . Pour la gestion du contexte de sécurité, des mesures distinctes doivent être mises en œuvre.
Exemple de mise en œuvre :
Exécuteur :
<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 :
<code class="java">public class ContextAwareCallable<T> implements Callable<T> { private Callable<T> task; private RequestAttributes context; @Override public T call() throws Exception { if (context != null) { RequestContextHolder.setRequestAttributes(context); } try { return task.call(); } finally { RequestContextHolder.resetRequestAttributes(); } } }</code>
Configuration :
<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
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!