CommandLineRunner 不执行

本文探讨了在Spring Boot项目中,如何避免CommandLineRunner和ApplicationRunner因使用阻塞方法导致的启动后不执行问题,提供了异步处理和调整线程优先级的解决方案,并通过实例演示了如何在TaskConsumer类中应用这些技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CommandLineRunner   在项目启动成功后执行
ApplicationRunner   在项目启动成功后执行

可能出现不执行的问题

你的某个实现类中使用了阻塞方法

解决办法

1 使用异步

2 把阻塞的那个优先度调低,其他的优先度调高


@Slf4j
@Order(1)   //方法1
public class TaskConsumer implements CommandLineRunner {

    @Override
    public void run(String ...args) throws Exception {
        new Thread(() -> {  //方法2
       
        }).start();
    }
}

### 解决 Spring Boot 中 `CommandLineRunner` 方法未执行的问题 当遇到 `CommandLineRunner` 接口方法未能按预期运行的情况时,可能涉及多个方面的原因。以下是详细的排查和解决方案: #### 1. 确认实现类被扫描到 为了确保实现了 `CommandLineRunner` 的类能够正常工作,必须确认此类位于组件扫描路径下。如果应用的包结构如下所示,则无需额外配置。 假设项目根目录下的包名为 `com.example.demo`,而 `CommandLineRunner` 实现类也在此包内或其子包中[^1]。 ```java package com.example.demo; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class MyRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("This is a test message from the command line runner."); } } ``` #### 2. 验证主应用程序位置 主应用程序类的位置非常重要。通常情况下,建议将主应用程序放置于最顶层的包中,以便自动发现其他组件和服务。例如,在上述例子中的 `OrderMain80` 和 `PaymentMain9003` 类都应处于顶级包之下[^2]。 #### 3. 使用 `@ComponentScan` 注解(如有必要) 如果自定义了包名或者有特殊需求,可以考虑显式指定要扫描哪些包来查找带有特定注解的bean。这可以通过在主程序上添加 `@ComponentScan(basePackages="your.package.name")` 来完成。 #### 4. 检查日志输出和其他异常情况 查看控制台的日志信息可以帮助定位问题所在。如果有任何错误堆栈跟踪或者其他警告提示,这些可能是导致 `CommandLineRunner` 执行的根本原因。此外,还可以通过设置更详细的日志级别来获取更多信息。 #### 5. 调试模式启用 开启调试模式有助于更好地理解整个启动过程以及各个阶段的状态变化。可以在命令行参数里加入 `-Ddebug=true` 或者修改 application.properties 文件以激活它。 ```properties # application.properties debug=true ``` #### 6. 多个 `CommandLineRunner` 的顺序管理 若有多个 `CommandLineRunner` 存在于同一个上下文中,默认会按照它们注册进容器里的先后次序依次调用。对于这种情况,可利用 `org.springframework.core.annotation.Order` 注解来自定义优先级。 ```java package com.example.demo; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Component @Order(1) public class FirstRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("First Runner executed"); } } @Component @Order(2) public class SecondRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("Second Runner executed"); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值