我在一个方法中发布了一个Event,该方法使用注解@ transmitting进行注解。该方法使用@ transactionaleventlist进行注解。
上面的设置导致了sync(我们可以使用@Async来改变它)事件处理,并且事件也通过spring modulith事件本身存储到数据库中(我使用postgres)。
然而,如果我使发布者非事务性(即删除@ transmittance注解),则发布者不会侦听和执行针对它的事件。我们也不会获得数据库条目,因为没有侦听器能够处理它。
我可以将事件日志更改为@ EventEvent日志以侦听非事务性事件,但在这种情况下,我会释放DB事件持久性
我希望发布者可以自由决定它是事务性的还是非事务性的。无论如何,发布者都必须侦听和执行为它准备的事件,并将事件持久化到DB中。
请帮帮忙!
我知道了
@TransactionalEventListener
public void notificationEvent(ProductEvent event) {
System.out.println("Listener 1 Start");
System.out.println("Listener 1 End");
}
字符串
发布者
// @Transactional
public void publishEvent() {
System.out.println("Publisher Start");
ProductEvent productEvent = new ProductEvent("Product A", "THIS IS PRODUCT", 777);
applicationEventPublisher.publishEvent(productEvent);
System.out.println("Publisher End");
}
型
1条答案
按热度按时间blpfk2vs1#
重要的是要理解为什么它首先不起作用。
*@ transactionaleventwords的性质
*事务同步
*非事务上下文
我不知道有任何Sping Boot 功能可以为您开箱即用。但是,您可以在捕获非事务性事件后启动新事务并将其手动持久化到数据库中。