[英]Spring Batch job with chunk size n, writes only the nth row for n times
这是我的第一个春季批处理作业,我的读取器,处理器,编写器在块大小为1时正常工作。但是当我将其设为10时,它只将每10行写入10次,而不是唯一的10行。 我知道这一定是我的bean设置方式的问题。 我尝试用@scope(“原型”)使用我的阅读器,但它并没有什么不同。 我发现了这一点,但我不知道如何每次在我的读者中获得一个新的bean。
Spring Batch块大小创建重复项 。
在此批处理配置中,在哪里/如何创建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();
}
}
这对春豆来说不是问题! 我的坏 块处理不断将数据添加到数组列表,直到达到块大小。 在我的处理器类中,我在进程方法之外创建了输出实例。 因此,在添加到arraylist时,它一直在取代整个arraylist。
这就是我的大块处理器发生的事情。 添加新的元素时,ArrayList的所有元素都会发生变化吗?
以前我的处理器
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 }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.