Метод выполнения тасклета, вызываемый при запуске весенней загрузки - PullRequest
0 голосов
/ 06 мая 2020

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

1 Ответ

0 голосов
/ 06 мая 2020

По умолчанию Spring Boot при запуске выполняет любое задание в контексте вашего приложения. Думаю, именно поэтому вы видите, что ваш тасклет выполняется дважды: один раз при запуске приложения и один раз при вызове API.

Если вы хотите отключить выполнение заданий при запуске, вам необходимо установить свойство spring.batch.job.enabled=false .

...