Spring模量事件

wkftcu5l  于 11个月前  发布在  Spring
关注(0)|答案(1)|浏览(116)

我在一个方法中发布了一个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");
    }

blpfk2vs

blpfk2vs1#

重要的是要理解为什么它首先不起作用。

*@ transactionaleventwords的性质

  • 它专门设计用于处理事务上下文中的事件。
  • 它确保事件侦听器与发布方法在同一事务中执行。
  • 这种保证对于一致性和数据完整性至关重要。
    *事务同步
  • Spring的transaction基础设施依赖于transaction同步。transaction中发布的事件与其生命周期同步。
  • 仅当事务成功提交时才调用侦听器。
    *非事务上下文
  • 当事件在事务外发布时,没有事务可与之同步。
  • @ transactionalEventsign机制不适用。

我不知道有任何Sping Boot 功能可以为您开箱即用。但是,您可以在捕获非事务性事件后启动新事务并将其手动持久化到数据库中。

相关问题