Maison >Java >javaDidacticiel >Comment puis-je accéder aux beans à portée de requête dans les tâches asynchrones au printemps ?
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 :
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>
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>
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>
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!