hello,大家好,我是小黑,又和大家见面啦~~

如果你去某度搜索关键词 CommandLineRunner 初始化资源 ,截止小黑同学写这篇推文之前,大概能收到 1,030,000 个结果。

网上大部分的文章都在告诉我们说可以使用 CommandLineRunner 去初始化资源,但几乎很少有文章告诉我们:如果 CommandLineRunner 使用不当,就会导致程序出现一些奇怪的异常,更有可能导致我们的应用直接停止运行

正在读这篇文章的你如果也使用了 CommandLineRunner 去初始化资源,那么小黑同学劝你耗子尾汁,赶紧来看一下下面这些案例吧~

CommandLineRunner 执行时间太久了???

@Slf4j
@SpringBootApplication
public class CommandLineRunnerDemoApp { private Map<String, String> map; public static void main(String[] args) {
SpringApplication.run(CommandLineRunnerDemoApp.class, args);
} @RestController
public class controller { @GetMapping("/name")
public String name() {
return map.get("name");
}
} @Bean
public CommandLineRunner commandLineRunner() {
return args -> {
// 模拟加载数据过慢
log.info("start do commandLineRunner...");
TimeUnit.MINUTES.sleep(1);
map = ImmutableMap.of("namne", "coder小黑");
log.info("do commandLineRunner end");
};
}
}

Spring 容器启动之后,访问 http://localhost:8080/name,此时后台就会直接报错:

通过报错信息我们可以知道:

CommandLineRunner 在 Spring 容器起来之后开始执行,但此时 Tomcat 已经可以正常接收请求。又由于本案例中 CommandLineRunner 的运行时间过长,数据还没有初始化完成,于是程序就开始出错了......

CommandLineRunner 执行报错了 ???

那如果 CommandLineRunner 在执行过程中报错了会怎么样呢?

答案是:Spring 容器会自动关闭,应用会停止服务。

可能读者会反驳小黑同学说:“CommandLineRunner 在启动时运行,如果 CommandLineRunner 运行报错,那就发布失败呗。”

其实还有更严重的......

当执行时间过长遇上报错,你的应用还好吗???

废话不多说,直接上具体案例,先看代码:

@Slf4j
@SpringBootApplication
public class CommandLineRunnerDemoApp2 implements CommandLineRunner { public static void main(String[] args) {
SpringApplication.run(CommandLineRunnerDemoApp2.class, args);
} @Override
public void run(String... args) throws Exception {
log.info("start do commandLineRunner...");
// 模拟任务执行时长
TimeUnit.MINUTES.sleep(1); // 模拟运行过程中出错
int i = 1 / 0; log.info("do commandLineRunner end");
}
}

运行日志如下:

可以看到,Spring 容器一开始正常运行,系统开始对外提供服务。一分钟之后,CommandLineRunner 在执行过程中报错,导致 Spring 容器关闭,应用停止服务。

再多说几句

虽然上文中这些案例都很简单,但小黑同学在实际过程中,还真就遇到过有同学使用 CommandLineRunner 去初始化了一个很耗时的资源,而在初始化资源的时候,又不小心报错了,于是应用就突然停止了。不过幸运的是,这次只是发生在了测试环境,线上一切正常。

最新文章

  1. “玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)
  2. Cent0S 升级Python会带来的问题
  3. 通过git在github上建立gh-pages分支并查看网页效果
  4. 【转】Java关键字final、static使用总结
  5. 记录Gzip函数
  6. 权限管理AppOpsManager
  7. WCF事务应用[转]
  8. UVALive 6255 Kingdoms --状态搜索
  9. ADB 在 Android SDK 的中的路径
  10. 漫游Kafka设计篇之数据持久化
  11. CNZZ每天百亿条日志写入,SLS+ODPS轻松拆招
  12. os mac apache+php+mysql环境配置
  13. JavaScript+HTML5 实现打地鼠小游戏
  14. win10 系统输入法与 idea的 ctr+shift+f 快捷键冲突,解决办法
  15. Hive实现交叉二维分析的小语句
  16. JEECG &amp; JEESite Tomcat集群 Session共享
  17. js 日期 相关
  18. 在虚拟机安装windows xp时所需要的序列号
  19. C语言Win32 Application 的标题栏图标,任务栏图标,exe文件图标问题
  20. imagick用法!

热门文章

  1. uboot——do_bootm
  2. 使用ViewPager实现卡片叠加效果
  3. Integer 错误的加锁
  4. JavaScript正则学习笔记
  5. Linux bash反弹shell原理引起的一点思考
  6. 「CSP-S 2019」Emiya 家今天的饭
  7. 第四章:动态规划I
  8. Java数据结构(十)—— 树
  9. C语言基础知识:几种特殊的函数宏封装方式
  10. 【鸿蒙开发板试用报告】用OLED板实现FlappyBird小游戏(中)