J'ai utilisé le AbstractRoutingDataSource avec grand succès, mais j'ai rencontré un problème que je ne peux pas résoudre : lorsque je lance une méthode asynchrone en utilisant @Async
, elle perd le contexte local du thread, et je ne parviens pas à déterminer l'endroit où définir le changement de contexte de base de données. Habituellement, je le fais dans un aspect ou dans un HandlerInterceptor
, mais @Async
ne passe par aucune de ces routes habituelles. Y a-t-il un intercepteur ou quelque chose de similaire que je peux configurer pour se déclencher au début et à la fin de l'appel asynchrone afin de pouvoir définir le contexte de base de données ?
J'ai trouvé une question similaire sur les forums de discussion de Spring. Pas de réponse, cependant : http://forum.springsource.org/showthread.php?83792-Async-annotated-method-hanging-on-session-scoped-bean
MODIFIER : J'ai débogué le flux d'exécution, et la source de données AbstractRoutingData est en fait appelée dans le thread asynchrone, mais elle est appelée avant que l'aspect ne soit appelé, donc le DataSource
est déjà défini dans la session Hibernate avant que la valeur de ThreadLocal
ne soit définie. En regardant le code source de AsyncExecutionInterceptor
, qui prend en charge @Async
, c'est parce que l'intercepteur retourne sa valeur Order
en tant que HIGHEST_PRECEDENCE
, donc il est déclenché avant tout le reste.