【发布时间】:2018-11-11 22:53:47
【问题描述】:
我有一个服务和两个具有 BEFORE_COMMIT 阶段的 TransactionalEventListener,一个监听 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);
}
}
服务方法执行后,数据库中有两行——“entity”和“entityA”。
替代 EventAListener 版本的工作方式相同。
将 EventBListener fallbackExecution 设置为 'true' 不会进行任何更改 - 不会调用 EventBListener。
将 EventBListener 阶段更改为 AFTER_COMMIT 有效 - EventB 已处理,但在另一个事务中。
为什么 EventB 没有被处理?
【问题讨论】:
标签: java spring spring-data-jpa spring-transactions