gpt4 book ai didi

Spring @TransactionalEventListener 没有按预期工作

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

我正在尝试使用 @TransactionalEventListener 监听事件,但即使在整个事务结束之前该事件也会被监听。即使该方法抛出异常,也会监听该事件。

这是我正在尝试做的示例代码

@Component
public class SampleListener{

@TransactionalEventListener
public void handleSomeTransactionalEvent(SampleEvent event){
//Some Logic
}
}

@Service
@Transactional
public class SampleInsertService{

@Autowired
private ApplicationEventPublisher applicationEventPublisher;

public void someTransactionalMethod(SomeDTO someDTO){
//Delete all call

//Again Insert all calls

//Publish event after insert
applicationEventPublisher.publishEvent(new SampleEvent(this, String.EventType, someDTO));

/** Some other call to DB which throws exception **/
}

}


public class SampleEvent implements ApplicationEvent{

private String eventType;

public SampleEvent(Object source, String eventType, SampleDTO sampleDTO){
//some logic
}

}

在这种情况下,只要在我的事务方法中完成插入,就会调用我的监听器。我相信这应该在所有数据库调用结束并且提交完成后调用。我是不是错过了什么。我正在使用 Spring 4.3.0。请指导我。

最佳答案

我想通了这个问题。如果您不使用 Spring MVC,则不会发生此问题。出现此问题是由于在 rootapplicationcontext 和子 webapplicationcontext(对于 Spring MVC)中加载了监听器类。

我在 application-context.xml 和 spring-web.xml 中都进行了通用组件扫描。因此,监听器类被加载了两次。一次用于 application-context.xml,再次用于 spring-web.xml。在删除 spring-web.xml 的通用组件扫描并在 spring-web.xml 中仅提及 Controller 包和过滤器包时,问题得到解决。

事务事件监听器在事务提交后仅被调用一次。

关于Spring @TransactionalEventListener 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37981524/

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