Я с большим успехом использую AbstractRoutingDataSource , но столкнулся с проблемой, которую не могу решить: когда я запускаю асинхронный метод с использованием @Async
, он теряет контекст локального потока , и я не могу понять, где установить переключатель контекста базы данных. Обычно я делаю это в аспекте или в HandlerInterceptor
, но @Async
не проходит ни по одному из этих обычных маршрутов. Есть ли перехватчик или что-то подобное, что я могу настроить для запуска в начале и в конце асинхронного вызова, чтобы установить контекст базы данных?
Нашли похожие вопросы на досках объявлений Spring. Ответа нет: http://forum.springsource.org/showthread.php?83792-Async-annotated-method-hanging-on-session-scoped-bean
РЕДАКТИРОВАТЬ: я отладил поток выполнения, и источник AbstractRoutingData на самом деле вызывается в асинхронном потоке, но вызывается до того, как вызывается аспект, поэтому DataSource
уже установлен в сеансе Hibernate до , значение ThreadLocal
устанавливается. Глядя на исходный код для AsyncExecutionInterceptor
, который поддерживает @Async
, это потому, что перехватчик возвращает значение Order
как HIGHEST_PRECEDENCE
, так что его запускают раньше всего.