• spring事件发布


    Spring事件发布

    Spring内置事件
    EventExplanation
    ContextRefreshedEvent在 ApplicationContext 初始化或刷新时发布
    ContextStartedEvent使用 ConfigurableApplicationContext 接口上的 start() 方法启动 ApplicationContext 时发布
    ContextStoppedEvent在通过使用 ConfigurableApplicationContext 接口上的 stop() 方法停止 ApplicationContext 时发布
    ContextClosedEvent在通过使用 ConfigurableApplicationContext 接口上的 close() 方法或通过 JVM 关闭挂钩关闭 ApplicationContext 时发布
    RequestHandledEvent一个特定于 Web 的事件,告诉所有 Bean 已为 HTTP 请求提供服务。此事件在请求完成后发布。此事件仅适用于使用 Spring 的 DispatcherServlet 的 Web 应用程序。
    ServletRequestHandledEventRequestHandledEvent 的子类,用于添加特定于 Servlet 的上下文信息
    同步事件发布
    public class OrderCreateEvent extends ApplicationEvent {
        @Getter
        private Long id;
        public OrderCreateEvent(Object source,Long id) {
            super(source);
            this.id=id;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    @Service
    @Slf4j
    public class OrderService {
        @Autowired
        private ApplicationEventPublisher applicationEventPublisher;
    
        public void submit() {
            log.info("提交事件");
            applicationEventPublisher.publishEvent(new OrderCreateEvent(this, 1001L));
            log.info("提交事件完成");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    同步事件消费
    @Service
    @Slf4j
    public class OrderConsumer {
        @EventListener
        public void listen(OrderCreateEvent event) {
            log.info("订单id:{}",event.getId());
            try {
                Thread.sleep(5000);
                log.info("订单处理完成...");
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    终端输出

    2023-10-11 09:13:50.095  INFO 23628 --- [nio-8080-exec-1] com.vmware.service.OrderService          : 提交事件
    2023-10-11 09:13:50.096  INFO 23628 --- [nio-8080-exec-1] com.vmware.event.OrderConsumer           : 订单id:1001
    2023-10-11 09:13:55.102  INFO 23628 --- [nio-8080-exec-1] com.vmware.event.OrderConsumer           : 订单处理完成...
    2023-10-11 09:13:55.102  INFO 23628 --- [nio-8080-exec-1] com.vmware.service.OrderService          : 提交事件完成
    
    • 1
    • 2
    • 3
    • 4
    开启异步事件
    @Service
    @Slf4j
    public class OrderConsumer {
        @EventListener
        @Async
        public void listen(OrderCreateEvent event) {
            log.info("订单id:{}",event.getId());
            try {
                Thread.sleep(5000);
                log.info("订单处理完成...");
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 使用@Async对监听方法进行修饰,并使用@EnableAsync开启异步处理

    终端输出

    2023-10-11 09:18:55.400  INFO 22308 --- [nio-8080-exec-2] com.vmware.service.OrderService          : 提交事件
    2023-10-11 09:18:55.403  INFO 22308 --- [nio-8080-exec-2] com.vmware.service.OrderService          : 提交事件完成
    2023-10-11 09:18:55.409  INFO 22308 --- [         task-1] com.vmware.event.OrderConsumer           : 订单id:1001
    2023-10-11 09:19:00.413  INFO 22308 --- [         task-1] com.vmware.event.OrderConsumer           : 订单处理完成...
    
    • 1
    • 2
    • 3
    • 4
    条件事件
    @EventListener(condition = "")
    
    • 1
    • @EventListener@TransactionalEventListener 都有 condition 属性,可以用来判断事件的参数满足一定条件的时候执行监听事件
    • 如果说发布事件传递的参数值不是该条件中指定的值,那么该监听器也不会执行
    顺序事件

    我们可以通过 @Order 注解来控制监听器的执行顺序,该注解的值越小,执行的顺序越靠前。不过在异步事件中不建议使用它来控制顺序,因为那样意义不大

    @Service
    @Slf4j
    public class OrderConsumer {
        @EventListener
        @Order(1)
        public void listen(OrderCreateEvent event) {
            log.info("订单id:{}", event.getId());
            try {
                Thread.sleep(5000);
                log.info("订单处理完成...");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        @EventListener
        @Order(2)
        public void listen2(OrderCreateEvent event) {
            log.info("发送邮件通知admin.");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    终端输出

    2023-10-11 09:27:37.895  INFO 8648 --- [nio-8080-exec-1] com.vmware.service.OrderService          : 提交事件
    2023-10-11 09:27:37.896  INFO 8648 --- [nio-8080-exec-1] com.vmware.event.OrderConsumer           : 订单id:1001
    2023-10-11 09:27:42.902  INFO 8648 --- [nio-8080-exec-1] com.vmware.event.OrderConsumer           : 订单处理完成...
    2023-10-11 09:27:42.903  INFO 8648 --- [nio-8080-exec-1] com.vmware.event.OrderConsumer           : 发送邮件通知admin.
    2023-10-11 09:27:42.903  INFO 8648 --- [nio-8080-exec-1] com.vmware.service.OrderService          : 提交事件完成
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    vue3使用swiper6.7.0写轮播图,按钮在轮播图外面
    OCR基本原理
    Python学习(5)-基础语法(输入和输出)
    Python文件操作详细介绍(打开、读取、写入、上下文管理器、关闭、异常处理;文件模式、编码、路径、读写位置、复制、移动、删除)
    Hexo在多台电脑上提交和更新
    推荐一款M1芯片电脑快速搭建集群的虚拟机软件
    SpringBoot集成OpenPDF导出pdf
    Docker 的基本概念和优势
    python系列教程184——尽量少用全局变量
    【云原生】什么是CI/CD? | CI/CD 带来的好处
  • 原文地址:https://blog.csdn.net/qq_52751442/article/details/133761054