java - Spring Boot 多个同步和异步应用程序事件监听器

标签 java spring spring-boot asynchronous event-listener

我有 3 个事件监听器监听同一个事件:

  1. 保存到数据库
  2. 缓存
  3. 发布消息

其中 12 按顺序同步执行,而 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/

相关文章:

java - 轴突框架 : How to use state-stored aggregates

java - Spring Boot 微服务嵌入式 tomcat 与外部 tomcat

java - 如何在 NordPOS 中创建自己的支付网关实例?

java - JTable中的JComboBox显示无效数据

java - 如何在 java 文件管理器应用程序中重命名文件和文件夹?

java - .Net 4 垃圾收集

java - 使用Spring批处理读取文件并写入Map

java - 如何向 cxf soap 请求添加自定义 header ?

java - Hibernate JPA 拦截器没有得到调用

spring - @Transaction 使我的 REST 端点消失