У меня есть служба и два TransactionalEventListeners с фазой BEFORE_COMMIT, один прослушивает EventA, другой - EventB.Сервис публикует EventA -> EventAListener вызывается и публикует другое событие - EventB.EventBListener не вызывается, и событие игнорируется.Пример кода:
@Service
@Transactional
public class ExampleService {
private ExampleEntityRepository repository;
private ApplicationEventPublisher applicationEventPublisher;
public void exampleMethod() {
repository.save(new ExampleEntity("entity"));
applicationEventPublisher.publishEvent(new EventA(this));
}
}
//==================================================
@Service
@Transactional
public class EventAListener {
private ExampleEntityRepository repository;
private ApplicationEventPublisher applicationEventPublisher;
@TransactionalEventListener(value = EventA.class, phase = TransactionPhase.BEFORE_COMMIT)
public void handle(EventA event) {
repository.save(new ExampleEntity("entityA"));
applicationEventPublisher.publishEvent(new EventB(this));
}
}
//==================================================
@Service
@Transactional
public class EventBListener {
private ExampleEntityRepository repository;
@TransactionalEventListener(value = EventB.class, phase = TransactionPhase.BEFORE_COMMIT)
public void handle(EventB eventB) {
repository.save(new ExampleEntity("entityB"));
}
}
//==================================================
// Alternative EventAListener version
@Service
@Transactional
public class EventAListener {
private ExampleEntityRepository repository;
@TransactionalEventListener(value = EventA.class, phase = TransactionPhase.BEFORE_COMMIT)
public EventB handle(EventA event) {
repository.save(new ExampleEntity("entityA"));
return new EventB(this);
}
}
После выполнения служебного метода в базе данных есть 2 строки - «entity» и «entityA».Альтернативная версия EventAListener работает так же.Установка EventBListener fallbackExecution в 'true' не вносит никаких изменений - EventBListener не вызываетсяИзменение фазы EventBListener на AFTER_COMMIT работает - EventB обрабатывается, но в другой транзакции.
Почему EventB не обрабатывается?