Я использую весеннюю загрузку и пишу задание, в котором есть только один шаг, и этот шаг вызывает 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 также вызывается метод 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());
}
}