首页 > 解决方案 > 我如何从 Spring Batch 中的 3 个不同的表中读取

问题描述

我正在尝试在每个步骤中使用自定义阅读器、处理器和编写器:

    public Step step1(StepBuilderFactory factory,
                         ItemReader reader,
                         ExpireAssessmentWriter writer,
                         AssessmentItemProcessor processor,
                         PlatformTransactionManager platformTransactionManager){
        return stepBuilderFactory.get("step1")
                .transactionManager(platformTransactionManager)
                .<Assessment,Assessment>chunk(10)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .build();
    }

    //update aggregate balance table
    @Bean
    public Step step2(StepBuilderFactory factory,
                      ItemReader reader,
                      BalanceItemWriter writer,
                      BalanceProcessor processor,
                      PlatformTransactionManager platformTransactionManager){
        return stepBuilderFactory.get("step2")
                .transactionManager(platformTransactionManager)
                .<Assessment,Assessment>chunk(10)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .build();
    }

    
    @Bean
    public Step step3(StepBuilderFactory factory,
                      ItemReader<Assessment> reader,
                      CustomWriter3 writer,
                      CustomItemProcessor3 processor,
                      PlatformTransactionManager platformTransactionManager){
        return stepBuilderFactory.get("step3")
                .transactionManager(platformTransactionManager)
                .<Assessment,Assessment>chunk(10)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .build();
    }

第一步工作正常,但只有当我把这个读者留在同一个班级时:

    private static final String READER_QUERY = "SELECT * FROM TABLE1 WHERE COLUMN='TEST'";

@Bean
    public JdbcCursorItemReader<Assessment> reader(DataSource dataSource) {
        return new JdbcCursorItemReaderBuilder<Assessment>()
                .dataSource(dataSource)
                .name("AssessmentUtilityReader")
                .sql(READER_QUERY)
                .rowMapper(new AssessmentMapper())
                .build();
    }

如何为每个步骤创建一个自定义阅读器来读取它自己的查询?

我可以创建一个扩展 JdbcCursorItemReader 并返回相同代码片段的自定义阅读器吗?:


@Bean
    public JdbcCursorItemReader<Assessment> reader(DataSource dataSource) {
        return new JdbcCursorItemReaderBuilder<Assessment>()
                .dataSource(dataSource)
                .name("AssessmentUtilityReader")
                .sql(READER_QUERY)
                .rowMapper(new AssessmentMapper())
                .build();
    }
    ```

标签: spring-batch

解决方案


要回答您的问题,,我们不能在同一个阅读器中使用多个查询。

但是在同一个作业中可能有三个不同的步骤,每个步骤可以查询不同的表,在此之前,请您解释一下当表不相关时在同一个作业中查询三个不同表的确切要求。


推荐阅读