有没有办法跳过仅针对特定作业的 Spring Batch 持久元数据?

Has*_*ral 6 spring spring-batch spring-boot

有几个示例说明我们如何在不将元数据持久化到数据库的情况下使用 Spring Batch。以下是有关此事的一些示例和相关问题:

但是我有一个稍微不同的用例:我有一些工作每小时运行一次,我想将元数据保存到我的数据库中(例如,创建报告,运行一些测试,这两者在处理过程中可能有点繁重)。我有一些其他类型的作业每分钟左右运行一次(例如解锁由于重复输入错误密码而被锁定的用户帐户等),它们不涉及太多处理,而是一个简单的 sql 查询。

这里的问题分为两部分:

  1. 有没有办法将第一类作业(例如报告处理)的元数据保留在数据库中,而对第二类作业(例如解锁用户帐户)根本不使用数据库持久性?

  2. 或者,甚至将 Spring Batch 用于第二类工作是否会矫枉过正/根本不需要?带@Scheduled注释的方法就足够了吗?

Has*_*ral 1

以下是我如何根据 Mahmoud Ben Hassine 的建议实现我正在寻找的目标(已删除@EnableBatchProcessing,对于一些不相关的问题 -请参阅此处):

我有两个配置类:

@Configuration
public class SpringBatchConfiguration extends DefaultBatchConfigurer {

    @Inject public SpringBatchConfiguration(DataSource dataSource) {
        super(dataSource);
    }

    @Bean(name = "persistentJobLauncher")
    public JobLauncher jobLauncher() throws Exception {
        return super.createJobLauncher();
    }

    @Bean
    @Primary
    public StepBuilderFactory stepBuilderFactory() {
        return new StepBuilderFactory(super.getJobRepository(), super.getTransactionManager());
    }

    @Bean
    @Primary
    public JobBuilderFactory jobBuilderFactory(){
        return new JobBuilderFactory(super.getJobRepository());
    }

    @Bean
    public JobExplorer jobExplorer() {
        return super.getJobExplorer();
    }

    @Bean
    public JobRepository jobRepository() {
        return super.getJobRepository();
    }

    @Bean
    public ListableJobLocator jobLocator() {
        return new MapJobRegistry();
    }
}
Run Code Online (Sandbox Code Playgroud)

以及内存中的:

@Configuration
public class SpringInMemoryBatchConfiguration extends DefaultBatchConfigurer {

    @Inject public SpringInMemoryBatchConfiguration() {
    }

    @Bean(name = "inMemoryJobLauncher")
    public JobLauncher inMemoryJobLauncher() throws Exception {
        return super.createJobLauncher();
    }

    @Bean(name = "inMemoryStepBuilderFactory")
    public StepBuilderFactory stepBuilderFactory() {
        return new StepBuilderFactory(super.getJobRepository(), super.getTransactionManager());
    }

    @Bean(name = "inMemoryJobBuilderFactory")
    public JobBuilderFactory inMemoryJobBuilderFactory(){
        return new JobBuilderFactory(super.getJobRepository());
    }
}
Run Code Online (Sandbox Code Playgroud)

当我想开始一项“持久”工作时,我使用@Qualifier(value = "persistentJobLauncher") JobLauncher launcher和 开始一项“内存”工作:@Qualifier(value = "inMemoryJobLauncher") JobLauncher launcher