spring事件发布

Spring事件发布

Spring内置事件
Event Explanation
ContextRefreshedEvent 在 ApplicationContext 初始化或刷新时发布
ContextStartedEvent 使用 ConfigurableApplicationContext 接口上的 start() 方法启动 ApplicationContext 时发布
ContextStoppedEvent 在通过使用 ConfigurableApplicationContext 接口上的 stop() 方法停止 ApplicationContext 时发布
ContextClosedEvent 在通过使用 ConfigurableApplicationContext 接口上的 close() 方法或通过 JVM 关闭挂钩关闭 ApplicationContext 时发布
RequestHandledEvent 一个特定于 Web 的事件,告诉所有 Bean 已为 HTTP 请求提供服务。此事件在请求完成后发布。此事件仅适用于使用 Spring 的 DispatcherServlet 的 Web 应用程序。
ServletRequestHandledEvent RequestHandledEvent 的子类,用于添加特定于 Servlet 的上下文信息
同步事件发布
public class OrderCreateEvent extends ApplicationEvent {
    @Getter
    private Long id;
    public OrderCreateEvent(Object source,Long id) {
        super(source);
        this.id=id;
    }
}
@Service
@Slf4j
public class OrderService {
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void submit() {
        log.info("提交事件");
        applicationEventPublisher.publishEvent(new OrderCreateEvent(this, 1001L));
        log.info("提交事件完成");
    }
}
同步事件消费
@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();
        }
    }
}

终端输出

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          : 提交事件完成
开启异步事件
@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();
        }
    }
}
  • 使用@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           : 订单处理完成...
条件事件
@EventListener(condition = "")
  • @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.");
    }
}

终端输出

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          : 提交事件完成

你可能感兴趣的:(SpringBoot,spring,java,spring,boot)