前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CommandLineRunner 可能会导致应用停止,我劝你耗子尾汁

CommandLineRunner 可能会导致应用停止,我劝你耗子尾汁

作者头像
Coder小黑
发布2020-12-15 15:39:12
1.1K0
发布2020-12-15 15:39:12
举报
文章被收录于专栏:Coder小黑Coder小黑

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

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

CommandLineRunner 初始化资源

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

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

CommandLineRunner 执行时间太久了???

代码语言:javascript
复制
@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 运行报错,那就发布失败呗。”

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

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

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

代码语言:javascript
复制
@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");
    }
}

运行日志如下:

报错日志2

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

再多说几句

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder小黑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CommandLineRunner 执行时间太久了???
  • CommandLineRunner 执行报错了 ???
  • 当执行时间过长遇上报错,你的应用还好吗???
  • 再多说几句
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档