spring启动期间调用的java Tasklet execute方法
我用的是spring boot,我写的作业只有一步,这一步叫做Tasklet
以下是代码:
@Configuration
public class ApiCallerJobConfiguration {
private Step createApiCallerTasklet(StepBuilderFactory steps) {
ApiCallerLogger.info("Create apiCallerTasklet");
return steps.get("createApiCallerTasklet")
.tasklet(new ApiCallerTasklet())
.build();
}
@Bean(name = "apiCallerJob")
public Job apiCallerJob(JobBuilderFactory jobs, StepBuilderFactory steps) {
ApiCallerLogger.info("Start apiCallerJob");
return jobs.get("apiCallerJob")
.start(createApiCallerTasklet(steps))
.build();
}
}
使用调试器时,我注意到我两次进入这个类:第一次(我想)是在spring的启动阶段,第二次是在“apiCallerJob”有效启动时。问题是,第一次创建ApiCallerTasklet时,也会调用Tasklet方法execute(),它会返回一个非阻塞异常(这是因为其中一个作业参数尚未增强);之后,执行继续进行,第二次执行tasklet时,一切正常
虽然这个错误是非阻塞性的,但我想知道问题出在哪里
“apiCallerJob”由此服务运行:
@Service
public class JobServiceImpl implements JobService {
@Autowired
private JobLauncher jobLauncher;
@Autowired
@Qualifier("apiCallerJob")
private Job apiCallerJob;
@Override
public JobExecution runJob(String rootContext, String dateFrom, String dateTo) throws Exception{
JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
jobParametersBuilder.addDate(ApiCallerJobParams.EXEC_TIMESTAMP.toString(), new Date());
jobParametersBuilder.addString(ApiCallerJobParams.CONTEXT_ROOT.toString(), rootContext);
jobParametersBuilder.addString(ApiCallerJobParams.DATE_FROM.toString(), dateFrom);
jobParametersBuilder.addString(ApiCallerJobParams.DATE_TO.toString(), dateTo);
return jobLauncher.run(apiCallerJob, jobParametersBuilder.toJobParameters());
}
}
# 1 楼答案
默认情况下,Spring Boot在启动时执行应用程序上下文中的任何作业。所以我想这就是为什么你会看到你的tasklet被执行了两次:一次是在应用程序启动时,一次是在你调用API时
如果要在启动时禁用正在运行的作业,则需要设置属性
spring.batch.job.enabled=false