我有一个本地库,该库作为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));
}
有没有一种方法可以有效地调试此问题。
答案 0 :(得分:1)
事实证明,问题出在我项目的设置中。 该应用程序在活动的Spring上下文中根本没有事务管理。
由于TransactionalEventListener
是春季交易的一部分,因此应该在上下文中使用交易管理以使其正常工作。
在pom中添加以下依赖项可以解决问题:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>