gpt4 book ai didi

java - 如果事件是从另一个监听器发布的,则忽略 TransactionalEventListener

转载 作者:行者123 更新时间:2023-12-04 12:45:20 26 4
gpt4 key购买 nike

我有一个服务和两个具有 BEFORE_COMMIT 阶段的 TransactionalEventListeners,一个监听 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);
}
}

执行service方法后,数据库中有2行——“entity”和“entityA”。替代 EventAListener 版本的工作方式相同。
将 EventBListener fallbackExecution 设置为 'true' 不会进行任何更改 - EventBListener 不会被调用。
将 EventBListener 阶段更改为 AFTER_COMMIT 有效 - EventB 已处理,但在另一个事务中。

为什么不处理 EventB?

最佳答案

我认为您的问题可能与 Wojtek 在此处发布的问题有关:
https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2

Spring 开发人员的回答如下:

BEFORE_COMMIT is not "anytime you want during the transaction". It's really before commit. What you're doing is using the transaction like nothing asked for a commit. Something did.



所以看起来 BEFORE_COMMIT 事件的链接是不可能的,并且可能不支持在该阶段执行另一个事务操作(即使它看起来有效)?

我认为可以更好地记录这个区域,因为对大多数人来说,“提交之前”只是意味着“提交某事之前”,并且不清楚在调用该事件处理程序时可以执行哪些操作。

关于java - 如果事件是从另一个监听器发布的,则忽略 TransactionalEventListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50649494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com