带有单独的 CommandLineRunner 的 Spring Boot 应用程序在应用程序启动时不应运行

问题描述 投票:0回答:1

我有一个表单中的 springboot 应用程序

src/main/java/example
 - Application.java
 - JobConfiguration.java
   scheduler
    - Job1.java
    - Job1Runner.java
    - Job2.java
    - Job2Runner.java

我希望能够在本地按需运行我的作业,因此我为每个作业创建一个单独的 Runner 类(例如

JobRunner.java
),但目前当我运行我的
Application
类时,它也运行我的
Job1Runner
类,因为它扩展了命令行运行程序。有什么办法可以让我的跑步者分开吗? (所以
Application
类不会运行它们,并且
JobRunner
不会互相运行等等)

申请

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

作业配置

@Configuration
@EnableScheduling
public class JobConfiguration implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // Register jobs
    }

}

JobRunner 示例

@SpringBootApplication(scanBasePackages = "com.example")
public class JobXRunner implements CommandLineRunner { // Where X is my job index

    @Autowired
    private final JobX job;

    @Override
    public void run(String... args) throws Exception {
        job.run();
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(JobXRunner.class, args);

    }
}
java spring-boot
1个回答
1
投票

解决这个问题的方法不止一种:

  1. 创建多个配置文件并将其分配给作业运行者。使用
    spring.profiles.active=jobrunner1
    从命令行激活一项,如果您想运行多个作业,则使用
    spring.profiles.active=jobrunner1,jobrunner2
    。该解决方案可让您保留多个
    CommandLineRunner
    实现。
  2. 指定要运行哪个类,这又取决于您执行代码的方式。如果使用 IDE 或 Maven 或 Gradle 等构建工具运行,则必须指定主类名称,因为默认解析不起作用。请参阅 this 线程以获取特定于 Maven 的解决方案。如果您正在运行该 jar,请参阅 this 线程。
    CommandLineRunner
    有一个
    main
    方法,因此您可以保留它们,或者只是转换为常规
    main
    类。
© www.soinside.com 2019 - 2024. All rights reserved.