Аннотации транзакций Spring - Выполнение при успехе

Я использую события приложения Spring в своем сервисном слое, чтобы уведомить более широкую систему о конкретных событиях. что события запускаются в контексте транзакции (я использую Spring ' s @Transactional аннотация). Опасность заключается в том, что я запускаю событие, а затем транзакция завершается неудачей при фиксации (это может произойти при использовании, например, Hibernate). В этом сценарии слушатели событий будут предполагать некоторое состояние, которое затем будет откатано после их выполнения. Опасность заключается в том, что я могу, например, отправить электронное письмо для подтверждения регистрации пользователя на веб-сайте, когда фактически его учетная запись пользователя фактически не была создана.

Есть ли способ, сохраняющий использование аннотаций, куда-то помечать событие, которое будет запущено после совершения транзакции? Это отчасти похоже на использование SwingUtilities.invokeLater (Runnable runnable) при программировании GUI на Java Swing. Я хочу сказать, выполнить этот бит кода позже, как только текущая транзакция завершается успешно.

Есть идеи?

Спасибо,

Эндрю

12
задан DrewEaster 16 August 2010 в 10:37
поделиться

1 ответ

Правильный способ решить вашу проблему с электронными письмами с подтверждением, вероятно, состоит в использовании распределенных транзакций с участвующим в них ресурсом JMS.

Однако в качестве быстрого и грязного решения вы можете попытаться создать оболочку вокруг PlatformTransactionManager , которая будет выполнять Runnable , зарегистрированные в некоторых ThreadLocal ] хранилище после успешной фиксации (и удалите его из ThreadLocal после отката). Фактически, AbstractPlatformTransactionManager имеет именно такую ​​логику с TransactionSynchronization s, но она слишком глубоко скрыта в деталях его реализации.

2
ответ дан 2 December 2019 в 19:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: