有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

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