2017-01-14 10 views
0

私は春のバッチジョブを実行していて、チャンクサイズを1より大きくすると、はチャンクサイズ= 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(); 
} 

答えて

0

上記のコードでは、誤ってプロトタイプBeanをシングルトークリーダーに設定しました。したがって、ただ1つのBeanがあり、再利用されています。そのため、チャンクプロセスが発生すると、同じBeanが上書きされ、コレクション内のすべての「n」個のオブジェクトが同じBeanを指しています。

新鮮なbeanを毎回読み取り器内で取得するか、新しいインスタンスを作成すると問題が解決されます

関連する問題