Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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引导批处理作业只运行一次?_Java_Spring_Spring Boot_Spring Batch_Batch Processing - Fatal编程技术网

Java 为什么Spring引导批处理作业只运行一次?

Java 为什么Spring引导批处理作业只运行一次?,java,spring,spring-boot,spring-batch,batch-processing,Java,Spring,Spring Boot,Spring Batch,Batch Processing,我用的是弹簧靴。我有一个批处理作业,我用这些类实现了它: 我的主要课程是: @SpringBootApplication @ComponentScan("com.batch") @PropertySource("classpath:application.properties") public class Application { public static void main(String[] args) { SpringApplication.run(Applic

我用的是弹簧靴。我有一个批处理作业,我用这些类实现了它:

我的主要课程是:

@SpringBootApplication
@ComponentScan("com.batch")
@PropertySource("classpath:application.properties")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }

}
我的时间表是:

@Component
@EnableScheduling
public class JobScheduler {

    @Scheduled(fixedRate = 10000)
    public void runJob() {
        SpringApplication.run(MyBatchConfig.class);
    }
}
我的批处理配置类是:

@Configuration
@EnableBatchProcessing
public class MyBatchConfig {

    @Value("${database.driver}")
    private String databaseDriver;
    @Value("${database.url}")
    private String databaseUrl;
    @Value("${database.username}")
    private String databaseUsername;
    @Value("${database.password}")
    private String databasePassword;

    @Bean
    public Job myJob(JobBuilderFactory jobs, Step s) {
        Job job = jobs.get("myJob")
                .incrementer(new RunIdIncrementer())
                .flow(s)
                .end()
                .build();
        return job;
    }

    @Bean
    public Step myStep(StepBuilderFactory stepBuilderFactory, ItemReader<Account> reader,
                      ItemWriter<Person> writer, ItemProcessor<Account, Person> processor) {
        TaskletStep step = stepBuilderFactory.get("myStep")
                .<Account, Person>chunk(1)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .build();
        step.setAllowStartIfComplete(true);
        return step;
    } ...
对重新运行作业没有影响

我该怎么办


提前感谢

您需要创建
JobLauncher
bean,并在scheduler中使用它来启动新的作业实例

这就是我能想到的

1.将此属性放入application.properties中,这样批处理作业不会通过调用
SpringApplication.run(…)
from
main
方法自动启动

spring.batch.job.enabled=false

这将只是初始化Spring批处理配置,而不是实际启动作业

2.将注释
@EnableScheduling
放在Spring Boot批处理作业开始类上,即代码中的
应用程序
类上

3.从
JobScheduler
类中删除
@EnableScheduling
注释,并从
runJob()
调用
jobLauncher.run(作业,作业参数)
,而不是调用
SpringApplication.run(MyBatchConfig.class)

JobLauncher
&
Job
bean可以自动连接到调度程序类,因为上下文已经初始化


希望能有帮助

像这样运行Spring Boot将运行作业并关闭。那个重新运行的调度器肯定不会做你们想做的事情;将导致它重新运行。但事实并非如此。那我该怎么办?嗨,PedramFarzaneh,你找到解决办法了吗。我也遇到了同样的问题。当我手动运行main类时,应用程序工作正常,但由调度程序执行,作业不会触发。@Ayush我可以借助Sabir Khan的答案解决这个问题。这对我有用。请遵循他的回答,希望这对您的案例也有帮助。谢谢luboskrnac,但这将引发一个例外,因为@EnableBatchProcessing已经安排了一个作业。很高兴问题得到解决,如果解决了您的问题,您可以接受我的回答。
SpringApplication.run(MyBatchConfig.class);