使用场景
在应用程序开发过程中,往往我们需要在容器启动的时候执行一些操作。
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
全部0条评论
快来发表一下你的评论吧 !