我正在使用弹簧靴。我有一个使用这些类实现的批处理作业:
我的主要课程是:
@SpringBootApplication @ComponentScan("com.batch") @PropertySource("classpath:application.properties") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class); } }
我的调度程序是:
@Component @EnableScheduling public class JobScheduler { @Scheduled(fixedRate = 10000) public void runJob() { SpringApplication.run(MyBatchConfig.class); } }
我的批处理配置类是:
@Configuration @EnableBatchProcessing public class MyBatchConfig { @Value("${database.driver}") private String databaseDriver; @Value("${database.url}") private String databaseUrl; @Value("${database.username}") private String databaseUsername; @Value("${database.password}") private String databasePassword; @Bean public Job myJob(JobBuilderFactory jobs, Step s) { Job job = jobs.get("myJob") .incrementer(new RunIdIncrementer()) .flow(s) .end() .build(); return job; } @Bean public Step myStep(StepBuilderFactory stepBuilderFactory, ItemReader<Account> reader, ItemWriter<Person> writer, ItemProcessor<Account, Person> processor) { TaskletStep step = stepBuilderFactory.get("myStep") .<Account, Person>chunk(1) .reader(reader) .processor(processor) .writer(writer) .build(); step.setAllowStartIfComplete(true); return step; } ...
现在,我的问题是:
调度程序可以工作,并且每十秒钟重复一次,但是作业仅在应用程序启动时执行(读取器,处理器和编写器在启动时仅执行一次),并且似乎
SpringApplication.run(MyBatchConfig.class);
对重新运行作业没有影响。
我该怎么办?
提前致谢
这就是我能想到的
1.您将此属性放在application.properties中,因此您的批处理作业不会通过调用SpringApplication.run(...)from main方法自动启动。
SpringApplication.run(...)
main
spring.batch.job.enabled=false
这将仅初始化您的Spring Batch配置,而不实际启动作业。
2. @EnableScheduling 在您的Spring Boot Batch Job起始类上添加注释,即在Application 代码中的类上。
@EnableScheduling
Application
3.取出@EnableScheduling从注释JobScheduler类和呼叫,jobLauncher.run(job, jobParameters)从runJob()而不是调用SpringApplication.run(MyBatchConfig.class)。
JobScheduler
jobLauncher.run(job, jobParameters)
runJob()
SpringApplication.run(MyBatchConfig.class)
JobLauncher``Job因为上下文已经初始化,所以&bean可以自动连接到您的调度程序类。
JobLauncher``Job
希望能帮助到你 !!