Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在spring启动期间调用的Tasklet execute方法_Java_Spring_Spring Boot_Spring Batch - Fatal编程技术网

Java 在spring启动期间调用的Tasklet execute方法

Java 在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

我使用SpringBoot,我编写了一个只有一个步骤的作业,这个步骤称为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());
}
} 

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


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

,默认情况下,spring Boot在启动时执行应用程序上下文中的任何作业。所以我想这就是为什么你会看到你的tasklet被执行了两次。您是否已尝试设置属性
spring.batch.job.enabled=false
?这对我很有效,非常感谢。不客气。我添加了一个答案,请接受它:。非常感谢。