即使fallbackExecution设置为true,TransactionalEventListener也不会触发

时间:2020-06-08 06:36:42

标签: spring-boot event-listener

我有一个本地库,该库作为maven依赖项集成在我的项目中。 该库将发布一个事件并自己监听。

发布事件的代码:

public void send(String pushDestination, String message) {
    MessagePush msgPush = new MessagePush(pushDestination, Collections.singletonList(message));
    this.applicationEventPublisher.publishEvent(msgPush);
}

以下是库监听事件的代码片段:

@TransactionalEventListener(
    phase = TransactionPhase.AFTER_COMMIT,
    fallbackExecution = true
)
public <T> void transactionEventListener(MessagePush msgPush) throws PushException {
    // Some logging here
    this.push(msgPush);
}

因此,预期代码的工作方式是我项目中的代码应调用send方法,该方法将使用MessagePush发布事件。该事件应由transactionEventListener监听,并应依次调用push

在我的代码中,在交易边界中调用send方法。但是,尽管在fallbackExecution批注中设置了标志TransactionalEventListener,但仍未触发方法transactionEventListener

稍微想一下,我在我的项目中创建了一个监听器,用于监听库事件,并且运行良好:

@EventListener
public void onMessageReceive(MessagePush msgPush) {
    log.info("Message received inside DemoEventListener: {}", new Gson().toJson(msgPush));
}

有没有一种方法可以有效地调试此问题。

1 个答案:

答案 0 :(得分:1)

事实证明,问题出在我项目的设置中。 该应用程序在活动的Spring上下文中根本没有事务管理。

由于TransactionalEventListener是春季交易的一部分,因此应该在上下文中使用交易管理以使其正常工作。

在pom中添加以下依赖项可以解决问题:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
</dependency>