使用场景
在应用程序开发过程中,往往我们需要在容器启动的时候执行一些操作。
Spring Boot中提供了CommandLineRunner和ApplicationRunner两个接口来实现这样的需求。
两个接口的不同
参数不同,其他大体相同,可根据实际需求选择合适的接口使用。
CommandLineRunner接口中run方法的参数为String数组,ApplicationRunner中run方法的参数为ApplicationArguments。
特殊的场景
在启动项目时,有时候我们所做的操作可能不是一次性的操作,有可能循环查询数据库,根据结果来处理不同的业务,亦或是监听消息队列……
遇到的坑
看下面一个例子,我们启动一个spring boot项目,正常启动情况下,项目启动后会打印启动时间。
如下图所示:
下面我们模拟一下启动项目时使用CommandLineRunner,有人说CommandLineRunner是项目启动完成后才调用的,我们看看现象。
再次启动spring boot 项目,看看日志,直接报错,启动异常了。
说明启动CommandLineRunner的执行其实是整个应用启动的一部分,没有打印最后的启动时间,说明项目是在CommandLineRunner执行完成之后才启动完成的。
此时CommandLineRunner的run方法执行的是一个循环,循环到第四次的时候,抛出异常,直接影响主程序的启动。
填坑
这样的问题该如何解决呢?
这个操作影响了主线程,那么我们是否可以重新开启一个线程,让他单独去做我们想要做的操作呢。
我们再看看这次的日志是什么样的:
此时CommandLineRunner执行的操作和主线程是相互独立的,抛出异常并不会影响到主线程。
程序打印了启动时间,并且CommandLineRunner中run方法报错后,应用程序并没有因为异常而终止。填坑成功。
原文链接:https://blog.csdn.net/zwq_zwq_zwq/article/details/81059017
责任编辑:lq6
-
接口
+关注
关注
33文章
8742浏览量
152119 -
spring
+关注
关注
0文章
340浏览量
14427 -
Boot
+关注
关注
0文章
150浏览量
35987
原文标题:什么?Spring Boot CommandLineRunner 有坑!?
文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
可以驱动两个直流有刷电机、一个双极步进电机的双H桥电机驱动芯片-SS8833E
![可以驱动<b class='flag-5'>两个</b>直流<b class='flag-5'>有</b>刷电机、一<b class='flag-5'>个</b>双极步进电机的双H桥电机驱动芯片-SS8833E](https://file1.elecfans.com/web3/M00/07/F8/wKgZO2er_F-Ae05YAALMfiGrzOU882.png)
EE-96:将两个AD73311编解码器与ADSP-218x接口
![EE-96:将<b class='flag-5'>两个</b>AD73311编解码器与ADSP-218x<b class='flag-5'>接口</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
评论