我有 3 个事件监听器监听同一个事件:
- 保存到数据库
- 缓存
- 发布消息
其中 1
和 2
按顺序同步执行,而 3
独立异步执行。我已启用 @EnableAsync
。
@Order(1)
@EventListener
fun handle(update: String) {
logger.info("Database $update")
//throw IOException()
}
@Order(2)
@EventListener
fun handle(update: String) {
logger.info("Cache $update")
}
@Async
@EventListener
fun handle(update: String) {
logger.info("Kafka $update")
}
按预期工作:
[nio-8080-exec-4] controller.Listener2 : Database user22
[nio-8080-exec-4] controller.Listener1 : Cache user22
[ task-21] controller.Listener3 : Kafka user22
数据库处理程序失败时出现问题:
[nio-8080-exec-7] controller.Listener2 : Database user22
[nio-8080-exec-7] controller.Controller : Failed to invoke event listener
为什么异步事件监听器不会被执行?
最佳答案
您可以将其视为事件调度程序对 @Async
注释一无所知。
因此,调度程序会按照您指定的顺序(或者,如此处所示,如果您没有添加订单,则按照默认顺序)同步调用这三个方法。
只有这样,在调用代理的异步方法时,异步代理才会在另一个线程中启动原始方法。
异步代理和事件调度程序独立运行,互不了解。
关于java - Spring Boot 多个同步和异步应用程序事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73282299/