我有一个本地库,该库作为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
方法在事务边界中以not调用。但是,尽管在fallbackExecution
注释中设置了TransactionalEventListener
标志,但仍然不会触发transactionEventListener
方法。
稍微说一下,我在我的项目中创建了一个监听器,该监听器监听库事件,并且运行良好:
@EventListener
public void onMessageReceive(MessagePush msgPush) {
log.info("Message received inside DemoEventListener: {}", new Gson().toJson(msgPush));
}
有没有一种方法可以有效地调试此问题。
事实证明,问题出在我项目的设置中。该应用程序在活动的Spring上下文中根本没有事务管理。