【问题标题】:Spring Batch chunk size creating duplicatesSpring Batch 块大小创建重复项
【发布时间】:2023-04-10 03:20:01
【问题描述】:

我正在运行 Spring 批处理作业,每当我将块大小增加到大于 1 的任何值时,可以说块大小 = n,它只是复制“nth”记录“n”次,而不是添加n条记录。以下是我的配置,请指点?

@Bean
public JobLauncher jobLauncher(JobRepository jobRepository){
    SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
    jobLauncher.setJobRepository(jobRepository);
    return jobLauncher;
}


@Bean
public JobRepository jobRepository(DataSource dataSource, PlatformTransactionManager transactionManager) throws Exception{
    JobRepositoryFactoryBean factoryBean = new JobRepositoryFactoryBean();
    factoryBean.setDataSource(dataSource);
    factoryBean.setTransactionManager(transactionManager);
    factoryBean.setDatabaseType("mysql");
    return factoryBean.getObject();

}


@Bean
public PlatformTransactionManager transactionManager() {
    return new ResourcelessTransactionManager();
}

@Bean
public DataSource dataSource(){
    DriverManagerDataSource datasource = new DriverManagerDataSource();
    datasource.setDriverClassName("com.mysql.jdbc.Driver");
    datasource.setUrl("jdbc:mysql://localhost:3306/mysqltest?useSSL=false");
    datasource.setUsername("user");
    datasource.setPassword("pwd");
    return datasource;
}


@Bean
@Autowired
public Job projectMasterJob(JobBuilderFactory jobs, Step projectMasterDump) {
    return jobs.get("projectMasterJob").incrementer(new RunIdIncrementer())
            .flow(projectMasterDump).end().build();
}


@Bean
@Autowired
public Step projectMasterDump(StepBuilderFactory stepBuilderFactory,
                    FlatFileItemReader projectMasterReader, ItemWriter projectMasterDbWriter) {
    return stepBuilderFactory.get("projectMasterDump")
            .chunk(10).reader(projectMasterReader).writer(projectMasterDbWriter).build();
}

@Bean
@Autowired
public ItemWriter projectMasterDbWriter(DataSource dataSource){
    JdbcBatchItemWriter<ProjectMasterDTO> writer = new JdbcBatchItemWriter<ProjectMasterDTO>();
    writer.setSql(sql);
    writer.setDataSource(dataSource);
    writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
    return writer;
}

@Bean
@Autowired
public FlatFileItemReader projectMasterReader(ProjectMasterDTO projectMasterDTO, DataFormatter dataFormatter){
    ExcelItemReader<ProjectMasterDTO> reader = new ExcelItemReader<>();
    reader.setDataFormatter(dataFormatter);
    reader.setBean(projectMasterDTO);
    reader.setMapperFile(new File("../instance-config/projectMapper.json"));
    return reader;
}


@Bean
@Scope("prototype")
public ProjectMasterDTO projectMasterDTO(){
    return new ProjectMasterDTO();
}

【问题讨论】:

    标签: java spring spring-batch


    【解决方案1】:

    在上面的代码中,我不小心将原型 bean 设置为我的单例阅读器。所以只有一个 bean 并且它被重用,因此当一个块过程发生时,同一个 bean 被覆盖并且集合中的所有“n”个对象都指向同一个 bean。

    每次在阅读器中检索一个新的 bean 或创建一个新实例都可以解决问题

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 2014-08-13
      • 2012-11-28
      相关资源
      最近更新 更多