首页 > 解决方案 > 命令行运行器和作业启动器

问题描述

当我尝试通过 CommandLineRunner 运行我的作业时,我收到以下错误:必须提供 JobLauncher。请在配置中添加一项。

我的 Spring Batch 配置类:

@Configuration
@EnableBatchProcessing
public class SpringBatchConfiguration implements BatchConfigurer{

    @Autowired
    private DataSource dataSource;
    
    @Autowired
    private JobBuilderFactory jobBuilders;
    
    
    @Autowired
    private StepBuilderFactory stepBuilders;
    
    
    @Autowired
    AdminAPIClient client;
    
    @Autowired
    AdditionalConfiguration additionalConfiguration;
    
    @Autowired
    EmailSender emailSender;
    
    
    @Autowired
    JobLauncher launcher;
    
    
    public SpringBatchConfiguration() {}
    
    private AdditionalConfiguration config;
    
    public SpringBatchConfiguration(AdditionalConfiguration configuration) {
        this.config = configuration;
    }
    

    
    
    
    @Override
    public JobRepository getJobRepository() throws Exception {
        JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
        factory.setDataSource(dataSource);
        factory.setTransactionManager(getTransactionManager());
        factory.setIsolationLevelForCreate(this.getConfiguration().getIsolationLevelForCreate());
        factory.setTablePrefix(this.getConfiguration().getSpringBatchTablePrefix());
        factory.setMaxVarCharLength(1200);
        return factory.getObject();
    }

    @Override
    public PlatformTransactionManager getTransactionManager() throws Exception {
        return new DataSourceTransactionManager(dataSource);
    }


    @Override
    public JobLauncher getJobLauncher() throws Exception {
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setJobRepository(getJobRepository());
        jobLauncher.afterPropertiesSet();
        this.launcher = jobLauncher;
        return jobLauncher;
    }


    @Override
    public JobExplorer getJobExplorer() throws Exception {
        JobExplorerFactoryBean factoryBean = new JobExplorerFactoryBean();
        factoryBean.setDataSource(this.dataSource);
        factoryBean.afterPropertiesSet();
        return factoryBean.getObject();
    }

    public AdditionalConfiguration getConfiguration() {
        return config;
    }

    public void setConfiguration(AdditionalConfiguration configuration) {
        this.config= configuration;
    }
    
    

    
    @Bean("dateRollForwardJob")
    public Job dateRollForwardJob() {
        return jobBuilders.get("someJob")
                //.preventRestart()
                .incrementer(new RunIdIncrementer())
                .start(rollForwardStep())
                .listener(new DateRollForwardJobListener(emailSender))
                .build();
    }

    @Bean
    public Step rollForwardStep() {
        return stepBuilders.get(StatementJobs.DATE_ROLLFORWARD_TASK.name())
                .tasklet(dateRollForwardTasklet(client, additionalConfiguration))
                .build();
    }
    
    @Bean
    public Tasklet dateRollForwardTasklet(AdminAPIClient client, AdditionalConfiguration configuration) {
        return new DateRollForwardTasklet(client, additionalConfiguration);
    }
    
    

}

我的命令行:

java -cp <classpath dirs> org.springframework.batch.core.launch.support.CommandLineJobRunner org.springframework.batch.core.launch.support.CommandLineJobRunner <<packagename>.SpringBatchConfiguration someJob

我究竟做错了什么?我的 Spring Boot 应用程序类是独立的。当我运行应用程序类但包含一个虚拟 CommandLineRunner bean 时,它可以正常工作并执行。当我通过命令行运行时,我只会收到此错误。

单独问题:通过命令行运行时,Spring Boot 主应用程序类的作用是什么?我在主类上有一些注释,例如 @EnableRetry - 通过命令行运行时,这些额外的注释将如何发挥作用?我是否必须在配置类上也有这些注释?

标签: spring-batch

解决方案


推荐阅读