关于这个 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)