Add @Transactional
注释到MyBusinessService.save
应该解决这个问题。
根据java文档,@TransactionalEventListener
工作范围内@Transactional
边界。
这是文档所说的,
If the event is not published within the boundaries of a managed transaction, the
* event is discarded unless the {@link #fallbackExecution} flag is explicitly set.
如果您不想在事务边界中使用服务方法,请使用@TransactionalEventListener(fallbackExecution = true)
编辑:
对于上述问题,存在三种可能的解决方案。
i. Mark class
as @Transactional
被视为交易性的
@Transactional
@Service
public class MyBusinessService {
private final ApplicationEventPublisher applicationEventPublisher;
@Autowired
public MyBusinessService(
ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
@Override
public void save() {
String data = "Testing event data";
MyBusinessEvent event = new MyBusinessEvent(data);
applicationEventPublisher.publishEvent(event);
}
}
二.具体服务方式为@Transactional
@Override
@Transactional
public void save() {
String data = "Testing event data";
MyBusinessEvent event = new MyBusinessEvent(data);
applicationEventPublisher.publishEvent(event);
}
三.如果您不想在事务边界中使用服务方法,请使用
@Slf4j
@Component
public class MyBusinessEventListener {
@TransactionalEventListener(fallbackExecution = true)
public void handleEvent(MyBusinessEvent myBusinessEvent) {
log.info("[MyBusinessEventListener] New event received with following data: {}", myBusinessEvent);
}
}