关于这个 Spring Batch @Scheduled() 注解以及如何手动启动 Spring Batch 作业的一些疑问?

Posted

技术标签:

【中文标题】关于这个 Spring Batch @Scheduled() 注解以及如何手动启动 Spring Batch 作业的一些疑问?【英文标题】:Some doubts about this Spring Batch @Scheduled() annotation and how to manually start a Spring Batch job? 【发布时间】:2021-10-20 23:11:51 【问题描述】:

我是 Spring Batch 的新手,我对如何安排作业在特定时间开始有以下疑问。

在我的项目中,我有这个 SpringBatchExampleJobLauncher 类:

@Component
public class SpringBatchExampleJobLauncher 

    private static final Logger LOGGER = LoggerFactory.getLogger(SpringBatchExampleJobLauncher.class);

    private final Job job;
    private final JobLauncher jobLauncher;
    private ExecutionContext executionContext;

    @Autowired
    public SpringBatchExampleJobLauncher(@Qualifier("updateNotaryDistrictsJob") Job job, 
                                         JobLauncher jobLauncher,
                                         ExecutionContext executionContext) 
        this.job = job;
        this.jobLauncher = jobLauncher;
        this.executionContext = executionContext;
    

    @Scheduled(cron = "0/10 * * * * *")
    public void runSpringBatchExampleJob() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException 
        LOGGER.info("Spring Batch example job was started");
        
        List<NotaryDistrict> notaryDistrictsList = new ArrayList<NotaryDistrict>();
        executionContext.put("notaryDistrictsList", notaryDistrictsList);
        
        jobLauncher.run(job, newExecution());

        LOGGER.info("Spring Batch example job was stopped");
    

    private JobParameters newExecution() 
        Map<String, JobParameter> parameters = new HashMap<>();

        JobParameter parameter = new JobParameter(new Date());
        parameters.put("currentTime", parameter);

        return new JobParameters(parameters);
    

如您所见,它包含 runSpringBatchExampleJob() 方法,该方法在 cron 表达式在 Scheduled 注释中设置的特定时间运行作业:

@Scheduled(cron = "0/10 * * * * *")
public void  throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException 

这个 CRON 异常的确切含义是什么:在我看来,该作业每 10 秒运行一次,但也许我错了。如何更改此 CRON 表达式以在每晚 01:00 AM 执行我的工作?

另一个疑问是:目前我有这个空的 JUnit 测试类:

@SpringBootTest
class UpdateInfoBatchApplicationTests 

    @Test
    void contextLoads() 
    


是否可以直接从 JUnit 类运行我的作业?我知道这不应该是一个合适的单元测试(也许更多是一个集成测试),但我也想测试我的整个工作,而不依赖于运行 JUnit 测试方法的 CRON 异常中设置的时间。

【问题讨论】:

【参考方案1】:

每凌晨 1:00 的 Spring cron 作业:

@Scheduled(cron = "0 0 1 * * ?")

检查here 了解 Linux 和 Spring 在编写 cron 作业方面的区别。

要测试 cron 作业,请检查 here。您需要测试自己的代码。

另外,你可以使用Awaitility库。

【讨论】:

以上是关于关于这个 Spring Batch @Scheduled() 注解以及如何手动启动 Spring Batch 作业的一些疑问?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Batch 简单应用 (Hello World)

Spring Batch -扩展和并行处理

Spring Batch 简单应用 (XML文件操作)

如何将 Spring Batch Cron 作业迁移到 Spring Cloud 任务

Spring Batch批处理框架初探

Spring Batch学习记录及示例项目代码