CommandLineRunner和ApplicationRunner接口实现类中run方法发生异常导致spring程序关闭

今天其他组的一个程序在k8s中启动报错,启动之后立马就关闭了。我去看日志,发现最后面报了一个UnknownHostException异常,感觉是这个原因导致的,然后查看异常栈。定位到一个CommandLineRunner接口实现类,这个实现类里面写了一个企业微信通知已经启动的代码,代码中发送了post请求,但是没有用try包裹起来。
我自己这组的项目也有类似的功能,不过我的实现是通过新建一个线程,在里面编写通知的代码,所以就算报错也不会导致程序关闭,其实我写的时候是不知道这里面抛出异常会导致程序关闭的,只能说碰巧了。
后面测试发现,实现了CommandLineRunner接口或者实现ApplicationRunner接口的类,只要在run方法里面发生了异常(不管是不是运行时异常)并且没有捕获的话,就会导致程序关闭。
在这里插入图片描述

springBoot项目启动之后,会执行SpringApplication中的run方法,初始化一些参数之后,会调用callRunners方法,这个方法就是去执行实现了CommandLineRunnerApplicationRunner接口的实现类run方法,注意这个方法被try包裹。
在这里插入图片描述
callRunners里面的代码比较简单,就是找到实现了那两个接口的bean对象,然后调用callRunner方法,callRunner方法里面就是调用我们重写的run方法,如果调用发生异常,异常会被抛出去。
在这里插入图片描述
在这里插入图片描述
调用callRunners报错之后,会进入catch块中,执行handleRunFailure方法,handleRunFailure方法里面会调用关闭的方法
在这里插入图片描述
在这里插入图片描述

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值