gpt4 book ai didi

java - block 大小为 n 的 Spring Batch 作业仅写入第 n 行 n 次

转载 作者:行者123 更新时间:2023-12-02 04:27:00 24 4
gpt4 key购买 nike

这是我的第一个 Spring 批处理作业,当 block 大小为 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();
}
}

最佳答案

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

这就是我的 block 处理器所发生的情况。 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 }

关于java - block 大小为 n 的 Spring Batch 作业仅写入第 n 行 n 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56603935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com