【问题标题】:Spring Batch job with chunk size n, writes only the nth row for n times块大小为 n 的 Spring Batch 作业,仅写入第 n 行 n 次
【发布时间】:2019-10-29 10:21:16
【问题描述】:

这是我的第一个春季批处理作业,当块大小为 1 时,我的读取器、处理器、写入器正常工作。但是当我将其设为 10 时,它只写入每 10 行 10 次,而不是唯一的 10 行。我知道这一定是我的 bean 设置方式的问题。我尝试将我的阅读器与@scope("prototype") 一起使用,但这并没有什么不同。我找到了这个,但我不确定如何每次都在我的阅读器中获得一个新的 bean。
Spring Batch chunk size creating duplicates.

我在哪里/如何在这个批处理配置中创建新的 TEstLayout 实例?

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    @Qualifier("callTestStep")
    public Step callTestStep(StepBuilderFactory stepBuilders) {
        return stepBuilders.get("callTestStep").tasklet(callTEstPgmTasklet()).build();
    }

    @Bean
    public CallTEstPgm callTEstPgmTasklet() {
        return new CallTEstPgm();
    }

    @Bean
    @Qualifier("clearOutFileStep")
    public Step clearOutFileStep(StepBuilderFactory stepBuilders) {
        return stepBuilders.get("clearOutFile").tasklet(clearOutFileTasklet()).build();
    }

    @Bean
    public ClearOutFile clearOutFileTasklet() {
        return new ClearOutFile();
    }

    // tag::readerwriterprocessor[]
    @Bean
    @Scope("prototype")
    JdbcCollectiveItemReader<TEstLayout> reader(DataSource dataSource) {
        JdbcCollectiveItemReader<TEstLayout> databaseReader = new JdbcCollectiveItemReader<>();
        databaseReader.setDataSource(dataSource);

        databaseReader
                .setSql(“select * from F33416BA order by x_id”)
);

        databaseReader.setRowMapper(new TEstMultitoOneRowMapper());
        return databaseReader;
    }

    @Bean
    public TEstProcessor processor() {
        return new TEstProcessor();
    }

    @Bean
    public JdbcBatchItemWriter<TestBalanceDetailLayout> writer(DataSource dataSource) {
        return new JdbcBatchItemWriterBuilder<TestBalanceDetailLayout>()
                .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
                .sql("INSERT INTO " + outFileLib.trim() + "/" + outFile.trim() + " Values (:wholeDetailString)")
                .dataSource(dataSource).build();
    }

    @Bean
    public Job BalanceSummary(JobCompletionNotificationListener listener, @Qualifier("callTestStep") Step callTestStep,
            @Qualifier("clearOutFileStep") Step clearOutFileStep,
            /* Step writeHeader, */ @Qualifier("writeDetailStep") Step writeDetailStep /* , Step writeFooter */) {
        return jobBuilderFactory.get("Balance_Summary_File").incrementer(new RunIdIncrementer()).listener(listener)
                .start(callTestStep).next(clearOutFileStep)
                // .next(writeHeader)
                .next(writeDetailStep)
                // .next(writeFooter)
                .build();
    }

    @Bean
    @Qualifier("writeDetailStep")
    public Step writeDetailStep(JdbcBatchItemWriter<TestBalanceDetailLayout> writer,
            JdbcCollectiveItemReader<TEstLayout> reader, TEstProcessor processor) {
        return stepBuilderFactory.get("writeDetail").<TEstLayout, TestBalanceDetailLayout>chunk(chunkSize)
                .reader(reader).processor(processor).writer(writer).build();
    }
}

【问题讨论】:

    标签: java spring spring-boot spring-batch


    【解决方案1】:

    这不是春豆的问题!这是我的错。块处理不断将数据添加到数组列表中,直到达到块大小。在我的处理器类中,我在 process 方法之外创建了输出实例。因此,在添加到数组列表时,它会不断替换整个数组列表。

    这就是我的块处理器发生的事情。 All elements of An ArrayList change when a new one is added?

    我之前的处理器

      public class TestProcessor implements ItemProcessor<TestLayout, TestBalanceDetailLayout> {
                    TestBalanceDetailLayout transformedDetail = new TestDetailLayout();
                    @Override
                public TestBalanceDetailLayout process(final TestLayout testLayout) throws Exception {  processor code }
    

    正确的代码

          public class TestProcessor implements ItemProcessor<TestLayout, TestBalanceDetailLayout> {
    
                    @Override
                public TestBalanceDetailLayout process(final TestLayout testLayout) throws Exception {
                    TestBalanceDetailLayout transformedDetail = new TestDetailLayout();
    processor code }
    

    【讨论】:

    • 你能从你的处理器发布实际的前后代码吗?
    猜你喜欢
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多