Spring 批次始终以 Spring 启动:spring.batch.job.enabled=false 不起作用
Spring Batch always starts with Spring Boot: spring.batch.job.enabled=false DOES NOT work
我有一个名为 MyApplication 的 Spring 启动应用程序。
我还有一个名为 JobStartupRunner 的 Spring 批处理应用程序。
每当我将 MyApplication 作为 Spring 启动应用程序启动时,JobStartupRunner 也会运行。我在 application.properties 文件中确实有 spring.batch.job.enabled=false,但它不起作用。
代码如下:
...
@SpringBootApplication
@EnableJpaRepositories(repositoryBaseClass = RepositoryImpl.class)
public class MyApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplication.class);
}
}
...
这是 Spring 批处理应用程序:
...
@SpringBootApplication
public class JobStartupRunner implements CommandLineRunner {
@Autowired
ApplicationContext context;
public static void main(String[] args) {
SpringApplication.run(JobStartupRunner.class, args);
}
@Override
public void run(String...args) throws Exception {
JobLauncher jobLauncher = context.getBean(JobLauncher.class);
JobParameters jobParameters = new JobParametersBuilder().addLong("time", System.currentTimeMillis()).toJobParameters();
Long jobId = null;
try {
jobId = jobLauncher.launchJob(jobParameters);
} catch (JobExecutionAlreadyRunningException e) {
e.printStackTrace();
} catch (JobRestartException e) {
e.printStackTrace();
} catch (JobInstanceAlreadyCompleteException e) {
e.printStackTrace();
} catch (JobParametersInvalidException e) {
e.printStackTrace();
}
System.out.println("Ran with JOB ID: " + jobId);
}
}
...
这是 Spring 批处理配置 class:
...
@Configuration("jobConfig")
@ComponentScan(basePackages = "com.mystuff")
@PropertySource("classpath:application.properties")
@EnableAutoConfiguration
@EnableBatchProcessing
public class JobConfig extends AbstractJobConfig {
<more stuff here>
}
...
如何防止 Spring Batch 应用程序在 "master" 应用程序启动时启动。
谢谢。
spring.batch.job.enabled
仅影响声明为 spring bean 的 Job
。
但是作业现在开始,因为您通过实现 CommandLineRunner
而不是将它们声明为 Job
bean 来手动启动它,因此 spring.batch.job.enabled
对它们没有影响。
您可以简单地在组件扫描中排除 JobStartupRunner
,这样它将不再执行:
@SpringBootApplication
@ComponentScan(excludeFilters={ @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=JobStartupRunner.class)})
public class MyApplication extends SpringBootServletInitializer {
}
我有一个名为 MyApplication 的 Spring 启动应用程序。 我还有一个名为 JobStartupRunner 的 Spring 批处理应用程序。 每当我将 MyApplication 作为 Spring 启动应用程序启动时,JobStartupRunner 也会运行。我在 application.properties 文件中确实有 spring.batch.job.enabled=false,但它不起作用。
代码如下: ...
@SpringBootApplication
@EnableJpaRepositories(repositoryBaseClass = RepositoryImpl.class)
public class MyApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplication.class);
}
}
...
这是 Spring 批处理应用程序: ...
@SpringBootApplication
public class JobStartupRunner implements CommandLineRunner {
@Autowired
ApplicationContext context;
public static void main(String[] args) {
SpringApplication.run(JobStartupRunner.class, args);
}
@Override
public void run(String...args) throws Exception {
JobLauncher jobLauncher = context.getBean(JobLauncher.class);
JobParameters jobParameters = new JobParametersBuilder().addLong("time", System.currentTimeMillis()).toJobParameters();
Long jobId = null;
try {
jobId = jobLauncher.launchJob(jobParameters);
} catch (JobExecutionAlreadyRunningException e) {
e.printStackTrace();
} catch (JobRestartException e) {
e.printStackTrace();
} catch (JobInstanceAlreadyCompleteException e) {
e.printStackTrace();
} catch (JobParametersInvalidException e) {
e.printStackTrace();
}
System.out.println("Ran with JOB ID: " + jobId);
}
}
... 这是 Spring 批处理配置 class: ...
@Configuration("jobConfig")
@ComponentScan(basePackages = "com.mystuff")
@PropertySource("classpath:application.properties")
@EnableAutoConfiguration
@EnableBatchProcessing
public class JobConfig extends AbstractJobConfig {
<more stuff here>
}
...
如何防止 Spring Batch 应用程序在 "master" 应用程序启动时启动。
谢谢。
spring.batch.job.enabled
仅影响声明为 spring bean 的 Job
。
但是作业现在开始,因为您通过实现 CommandLineRunner
而不是将它们声明为 Job
bean 来手动启动它,因此 spring.batch.job.enabled
对它们没有影响。
您可以简单地在组件扫描中排除 JobStartupRunner
,这样它将不再执行:
@SpringBootApplication
@ComponentScan(excludeFilters={ @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=JobStartupRunner.class)})
public class MyApplication extends SpringBootServletInitializer {
}