Я использую события приложения Spring в своем сервисном слое, чтобы уведомить более широкую систему о конкретных событиях. что события запускаются в контексте транзакции (я использую Spring ' s @Transactional
аннотация). Опасность заключается в том, что я запускаю событие, а затем транзакция завершается неудачей при фиксации (это может произойти при использовании, например, Hibernate). В этом сценарии слушатели событий будут предполагать некоторое состояние, которое затем будет откатано после их выполнения. Опасность заключается в том, что я могу, например, отправить электронное письмо для подтверждения регистрации пользователя на веб-сайте, когда фактически его учетная запись пользователя фактически не была создана.
Есть ли способ, сохраняющий использование аннотаций, куда-то помечать событие, которое будет запущено после совершения транзакции? Это отчасти похоже на использование SwingUtilities.invokeLater (Runnable runnable)
при программировании GUI на Java Swing. Я хочу сказать, выполнить этот бит кода позже, как только текущая транзакция завершается успешно.
Есть идеи?
Спасибо,
Эндрю
Правильный способ решить вашу проблему с электронными письмами с подтверждением, вероятно, состоит в использовании распределенных транзакций с участвующим в них ресурсом JMS.
Однако в качестве быстрого и грязного решения вы можете попытаться создать оболочку вокруг PlatformTransactionManager
, которая будет выполнять Runnable
, зарегистрированные в некоторых ThreadLocal
] хранилище после успешной фиксации (и удалите его из ThreadLocal
после отката). Фактически, AbstractPlatformTransactionManager
имеет именно такую логику с TransactionSynchronization
s, но она слишком глубоко скрыта в деталях его реализации.