Spring @Async и AbstractRoutingDataSource - PullRequest
       0

Spring @Async и AbstractRoutingDataSource

6 голосов
/ 07 сентября 2011

Я с большим успехом использую 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, так что его запускают раньше всего.

enter image description here

1 Ответ

2 голосов
/ 10 октября 2011

Думаю, я нашел ответ: перехват выполнения метода не сможет установить переменную на ThreadLocal, поскольку AsyncExecutionInterceptor всегда будет иметь более высокий приоритет и запускать транзакцию Hibernate.Вместо этого я извлек логику из асинхронного метода в свой собственный класс и пометил этот метод как требующий собственной транзакции через @Transactional(propagation=Propagation.REQUIRES_NEW).Поскольку этот суб-метод теперь выполняется в своей собственной транзакции, переменная в ThreadLocal правильно выбирается AbstractRoutingDataSource в начале новой транзакции Hibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...