我是 Spring Batch 的新手,我有一个 Spring Boot 应用程序,我想设置一个在 Spring Boot 应用程序启动后仅执行一次的作业,因为我们每天都会运行应用程序
在我当前的解决方案中,我尝试使用属性
@Scheduled
,但我不确定它应该具有什么值。
@Scheduled(cron = "0/10 * * * * *")
public void runMyJob() {
jobLauncher.run(job, newExecution());
}
private JobParameters newExecution() {
Map<String, JobParameter> parameters = new HashMap<>();
JobParameter parameter = new JobParameter(new Date());
parameters.put("currentTime", parameter);
return new JobParameters(parameters);
}
}
@Bean
public Step jobStep(ItemReader<ReadObject> reader,
ItemWriter<WriteObject> writer,
StepBuilderFactory stepBuilderFactory) {
return stepBuilderFactory.get("jobStep1")
.<ReadObject, WriteObject>chunk(1)
.reader(reader)
.writer(writer)
.build();
}
@Bean
public Job myJob(Step jobStep,
JobBuilderFactory jobBuilderFactory) {
return jobBuilderFactory.get("myJob")
.incrementer(new RunIdIncrementer())
.flow(jobStep)
.end()
.build();
}
}
@SpringBootApplication
@EnableBatchProcessing
@EnableScheduling
public class SpringBatchApplication {
public static void main(String[] args) {
try{
SpringApplication.run(SpringBatchApplication.class, args);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我也有同样的情况,我的作业重复执行的原因是我没有在阅读器中返回
null
。来自 ItemReader
的 read
的文档:
读取一条输入数据并前进到下一条。实现必须在输入数据集的末尾返回
。null
因此,如果您根本不返回
null
,它将永远读取相同的输入。我使用阅读器中的标志解决了这个问题:
private boolean endOfInput = false;
public ReadObject read() {
if (endOfInput) {
endOfInput = false;
return null;
}
endOfInput = true;
// read your input chunk
return chunk;
}