Java 在spring启动期间调用的Tasklet execute方法
我使用SpringBoot,我编写了一个只有一个步骤的作业,这个步骤称为TaskletJava 在spring启动期间调用的Tasklet execute方法,java,spring,spring-boot,spring-batch,Java,Spring,Spring Boot,Spring Batch,我使用SpringBoot,我编写了一个只有一个步骤的作业,这个步骤称为Tasklet这是代码: @Configuration public class ApiCallerJobConfiguration { private Step createApiCallerTasklet(StepBuilderFactory steps) { ApiCallerLogger.info("Create apiCallerTasklet"); return steps.get("creat
这是代码:
@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());
}
}
默认情况下,SpringBoot在启动时执行应用程序上下文中的任何作业。因此,我想这就是为什么您会看到tasklet被执行两次:一次是在应用程序启动时,一次是在调用API时
如果要在启动时禁用正在运行的作业,则需要设置属性
spring.batch.job.enabled=false
,默认情况下,spring Boot在启动时执行应用程序上下文中的任何作业。所以我想这就是为什么你会看到你的tasklet被执行了两次。您是否已尝试设置属性spring.batch.job.enabled=false
?这对我很有效,非常感谢。不客气。我添加了一个答案,请接受它:。非常感谢。