gpt4 book ai didi

java - Spring Boot启动时调用的Tasklet执行方法

转载 作者:行者123 更新时间:2023-12-01 16:53:33 24 4
gpt4 key购买 nike

我正在使用 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(),并返回一个非阻塞异常(因为其中一个作业参数尚未增强);之后,执行继续,第二次执行该微线程时,一切正常。

尽管此错误是非阻塞的,但我想了解问题所在。

“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());
}
}

最佳答案

默认情况下,Spring Boot 在启动时执行应用程序上下文中的任何作业。所以我想这就是为什么您会看到您的 tasklet 被执行两次:一次在应用程序启动时执行,一次在您调用 API 时执行。

如果您想在启动时禁用正在运行的作业,您需要设置属性spring.batch.job.enabled=false

关于java - Spring Boot启动时调用的Tasklet执行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61634920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com