如何让Spring Batch作业只执行一次

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

我是 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();
        }
    }

}
java spring-boot spring-batch cron-task
1个回答
0
投票

我也有同样的情况,我的作业重复执行的原因是我没有在阅读器中返回

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.