繁体   English   中英

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

[英]TransactionalEventListener ignored if event is published from another listener

我有一个服务和两个带有阶段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?

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

Spring开发人员对此回答如下:

BEFORE_COMMIT不是“您在交易期间的任何时候”。 确实是 提交之前 您正在执行的操作是使用事务,就像什么都不需要提交一样。 做了什么。

因此,似乎不可能链接BEFORE_COMMIT事件,并且也许不支持在该阶段执行另一个事务操作(即使它似乎可以工作)?

我认为可以更好地记录该领域,因为对于大多数人来说,“提交之前”仅表示“提交某些内容之前”,并且还不清楚调用该事件处理程序时可以执行哪些操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM