ApplicationListener , @EventListener 和 CommandLineRunner 启动顺序验证

这篇具有很好参考价值的文章主要介绍了ApplicationListener , @EventListener 和 CommandLineRunner 启动顺序验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 背景

排查线上问题, 发现一个重要功能的全局锁线程启动延迟很高. 服务启动40分钟之后, 才能拿到锁. 排查之后发现原因是因为代码引入了高优先级的ApplicationListener代码, 导致全局锁线程启动延迟.

二. 结论

启动顺序从高到底依次为: ApplicationListener , @EventListener, CommandLineRunner , 分别可以使用order调整排序.
但是order只能控制同类型间的启动顺序.文章来源地址https://www.toymoban.com/news/detail-663415.html

三. 伪代码

3.1. 实现ApplicationListener接口

优先级最高,  可以有多个, 同ApplicationListener类型之间, 可以通过@Order(1) 注解控制相同ApplicationListener实现的启动顺序. 

import java.util.concurrent.TimeUnit;
import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(1)
public class ApplicationListener02Test implements ApplicationListener<WebServerInitializedEvent> {
  @Override
  public void onApplicationEvent(WebServerInitializedEvent event) {
    System.out.println("Listener : ApplicationListener02Test");
    try {
      TimeUnit.SECONDS.sleep(10);
    } catch (InterruptedException e) {
      throw new RuntimeException(e);
    }
  }
}


3.2. @EventListener 注解方式

@EventListener 注解方式 优先级是低于 实现ApplicationListener的方式.  必须等实现ApplicationListener类都执行完才启动, 可以通过@Order(1) 注解控制相同@EventListener实现的启动顺序.

import java.util.concurrent.TimeUnit;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
public class EventListener02Test {

  @EventListener
  @Order(0)
  public void listener(ContextRefreshedEvent event) {
    System.out.println("Listener : EventListener02Test");
    try {
      TimeUnit.SECONDS.sleep(10);
    } catch (InterruptedException e) {
      throw new RuntimeException(e);
    }
  }

}

3.3. 实现CommandLineRunner 方式

优先级最低. 实现CommandLineRunner接口方式 优先级是低于 @EventListener的方式.  必须等实现@EventListener类都执行完才启动, 可以通过@Order(1) 注解控制相同CommandLineRunner实现的启动顺序.
package com.netease.easyflink.monitor.listener;

import java.util.concurrent.TimeUnit;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(1)
public class CommandLineRunner01Test implements CommandLineRunner {
  @Override
  public void run(String... args) throws Exception {
    System.out.println("Listener : CommandLineRunner01Test");
    try {
      TimeUnit.SECONDS.sleep(10);
    } catch (InterruptedException e) {
      throw new RuntimeException(e);
    }

  }
}

到了这里,关于ApplicationListener , @EventListener 和 CommandLineRunner 启动顺序验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring监听器用法与原理详解(带ApplicationListener模型图)

    相信大家都或多或少知道Spring中的监听器,有些人还能说出它采用了 观察者模式 ,但其实它还用到了 适配器模式 , 工厂模式 等。当然,仍有不少人是完全不了解Spring的监听及其机制的,本次我们就来深入学习一下 Spring监听器 Spring监听器是一种 特殊的类,它们能帮助开发

    2024年02月06日
    浏览(60)
  • 扯下@EventListener这个注解的神秘面纱。

    你好呀,我是歪歪。 前段时间看到同事在项目里面使用了一个叫做 @EventListener 的注解。 在这之前,我知道这个注解的用法和想要达到的目的,但是也仅限于此,其内部工作原理对我来说是一个黑盒,我完完全全不知道它怎么就实现了“监听”的效果。 现在既然已经出现在项

    2023年04月10日
    浏览(38)
  • SpringBoot中间件使用之EventBus、Metric、CommandLineRunner

    1、EventBus 使用EventBus 事件总线的方式可以实现消息的 发布/订阅 功能,EventBus是一个轻量级的消息服务组件,适用于Android和Java。 // 1.注册事件通过 EventBus.getDefault().register(); // 2.发布事件 EventBus.getDefault().post(“事件内容”); // 3.监听事件,通过在方法上添加注解 @Subscribe实现

    2024年02月13日
    浏览(43)
  • 超简单实用docker设置容器启动顺序

    问题描述: 在分布式项目部署的过程中,经常要求服务器重启之后,应用能够自动恢复使用,设置开机自启docker及所有容器后会出现的问题是部分服务或环境存在依赖关系导致启动失败。这时就需要控制一下各个服务之间的启动顺序了。 解决办法 1、首先得设置docker开机重启:

    2024年02月15日
    浏览(42)
  • 麒麟系统+Windows双系统修改启动顺序

    开机进入麒麟系统,使用Ctrl+Alt+T调出终端。 通过su命令来获取root权限,输入sudo su命令后回车显示输入密码(输入开机密码)。 使用命令修改grub文件。 进入grub文件按 “ i ” 修改进入编辑模式,找到GRUB_DEFAULT = 0【默认启动顺序,从0开始算(例:Windows启动项在第三个,GRU

    2024年02月11日
    浏览(35)
  • Docker容器配置启动顺序的三种方式

    https://blog.csdn.net/L_Open2021/article/details/129901741 目录 1.问题描述 2.问题解决 方法1:通过 depends_on 结合 healthcheck 实现容器顺序启动(强烈推荐!)  方案2:shell脚本弹窗被依赖(较复杂) 方案3:通过Docker file 设置延时启动(不推荐,伪顺序) 在微服务项目中,多容器之间存在

    2024年02月07日
    浏览(93)
  • 电气控制基本原理3--三台电机顺序启动与停止

    目录 文章目录                         前言                 ​​​​​​​        题目                 ​​​​​​​        答案                 ​​​​​​​        ​​​​​​​总结 我使用了EPLAN软件进行原理图

    2024年02月11日
    浏览(34)
  • docker-compose 如何安排容器启动的顺序

    在使用docker-compose进行容器部署的时候,时常是需要对容器的启动顺序进行编排,比如在应用容器启动前,需要先启动数据库的容器。通过对官方文档的阅读,发现在docker-compose中,可以使用depends_on配合健康检查healthcheck来实现。 参考链接: https://docs.docker.com/compose/compose-fi

    2024年02月12日
    浏览(49)
  • 如何在VMware ESXi中调整虚拟机启动顺序

    默认情况下,位于VMWare ESXi(免费虚拟机监控程序)或VMWare Workstation上的虚拟机不会在主机启动时自动启动。这意味着ESXi/Workstation 主机重新启动(计划重新启动或崩溃)后,管理员必须手动启动所有虚拟机。 自动启动顺序字段以数字显示,若数字显示1,这意味着此虚拟机将

    2024年02月16日
    浏览(78)
  • java 实现事件监听EventListener的方式详解及分析

    我们开发中经常遇到监听事件,首先我们先来了解下事件相关知识: 使用场景(场景一):银行操作转账成功后需要给客户发送短信和邮件,使用事件就可以实现解耦并异步。 我们监听事件之前要有事件源source,创建事件源(Event),发布事件(publishEvent),然后才能到监听事

    2024年02月07日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包