java - 为什么 Spring Boot Batch 作业只运行一次?

标签 java spring spring-boot spring-batch batch-processing

我正在使用 Spring Boot 。我有一个批处理作业,我已经用这些类实现了:

我的主课是:

@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;
    } ...

现在,我的问题是:

调度器工作并且每十秒重复一次, 但是作业只在应用程序启动时执行(读取器、处理器和写入器只在启动时执行一次),而且似乎

SpringApplication.run(MyBatchConfig.class);

对重新运行作业没有影响。

我该怎么办?

提前致谢

最佳答案

这是我能想到的,

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

spring.batch.job.enabled=false

这将简单地初始化您的 Spring Batch 配置,而不是真正开始作业。

2.将注解 @EnableScheduling 放在您的 Spring Boot Batch Job 起始类上,即代码中的 Application 类上。

3.从 JobScheduler 类中移除 @EnableScheduling 注解,并从 runJob( ) 而不是调用 SpringApplication.run(MyBatchConfig.class)

JobLauncherJob bean 可以自动连接到您的调度程序类,因为上下文已经初始化。

希望对您有所帮助!!

关于java - 为什么 Spring Boot Batch 作业只运行一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41361883/

相关文章:

java - 多个 Spring @RequestMapping header

java - 如何在不继续不受信任的证书页面的情况下从 Angular2 发出 https 请求

java - Spring Data Elasticsearch 与 ES 7.2.1 |索引时 GeoPoint 映射失败

java - 如何在 Spark 中将两个 DataFrame 与组合列连接起来?

java - Spring表单将空模型对象发送到数据库

Spring Social 记住我登录

java - Tomcat 在使用 WebappRunner 时卡在 "Starting ProtocolHandler"

java - JpaRepository 不返回任何我的自定义查询

java - 在使用海报扩展的 Java REST Web 服务中使用 POST 时出现 415 错误

java - 从 Hazelcast 访问 Spring 上下文执行 mOnKey Owner