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