[英]How to run Spring Batch Jobs in certain order (Spring Boot)?
[英]how to read csv columns in different order in spring batch with spring boot
我正在创建一个弹簧批处理应用程序,该应用程序读取csv文件并存储在db中。
只有在按顺序设置列名时,我才能读取它并将其存储在db中。
当我更改csv文件中的顺序时,它不起作用。
我的目标:
我的目标是即使列名不按顺序读取文件并存储在db中。
我的CSv文件如下所示:
id,name
1,xyz
上面的订单正在按预期工作。 但是如果更改如下所示的顺序,则无法正常工作。 我该如何解决?
name,id
xyz,1
我的批处理配置:
@Configuration
@EnableBatchProcessing
public class SpringBatchConfiguration {
@Bean
public Job job(JobBuilderFactory jobBuilderFactory,StepBuilderFactory stepBuilderFactory,
ItemReader<BatchProcessEntity> itemReader,ItemWriter<BatchProcessEntity> itemWriter,ItemProcessor<BatchProcessEntity,BatchProcessEntity> itemProcessor) {
Step step = stepBuilderFactory.get("Loading-file")
.<BatchProcessEntity,BatchProcessEntity>chunk(100)
.reader(itemReader)
.processor(itemProcessor)
.writer(itemWriter)
.build();
Job job=jobBuilderFactory.get("Csv")
.incrementer(new RunIdIncrementer())
.start(step).build();
return job;
}
@Bean
public FlatFileItemReader<BatchProcessEntity> flatFileItemReader(@Value("${input}") Resource resource) {
FlatFileItemReader<BatchProcessEntity> flatFileItemReader=new FlatFileItemReader<>();
flatFileItemReader.setResource(resource);
flatFileItemReader.setName("Loading Csv File");
flatFileItemReader.setLinesToSkip(1);
flatFileItemReader.setLineMapper(lineMapper());
return flatFileItemReader;
}
@Bean
public LineMapper<BatchProcessEntity> lineMapper() {
DefaultLineMapper<BatchProcessEntity> defLineMapper=new DefaultLineMapper<>();
DelimitedLineTokenizer delimitedLineTokenizer=new DelimitedLineTokenizer();
delimitedLineTokenizer.setDelimiter(",");
delimitedLineTokenizer.setStrict(true);
delimitedLineTokenizer.setNames(new String[] {"id","name"});
BeanWrapperFieldSetMapper<BatchProcessEntity> beanWrapperFieldSetMapper=new BeanWrapperFieldSetMapper<>();
beanWrapperFieldSetMapper.setTargetType(BatchProcessEntity.class);
defLineMapper.setLineTokenizer(delimitedLineTokenizer);
defLineMapper.setFieldSetMapper(beanWrapperFieldSetMapper);
return defLineMapper;
}
}
我的实体:
@Entity
@Table(name="springbatchprocess")
@Data
public class BatchProcessEntity {
@Id
Integer id;
@Column(name="name")
String eName;
@Column(name="address")
String eAddress;
@Column(name="salary")
String eSalary;
@Column(name="dept")
String eDept;
@Column(name="status")
Integer eStatus;
@Column(name="date")
Date date;
}
仅当我按照代码中定义的顺序设置列时,以上代码才能正常工作。 当我更改订单时,它不起作用?
我该如何解决?
您需要编写一个自定义映射器来执行此操作。 本教程中提供了一个示例:
https://www.baeldung.com/introduction-to-spring-batch
就像这样:
public class BatchProcessFieldSetMapper implements FieldSetMapper<BatchProcessEntity> {
public BatchProcessEntity mapFieldSet(FieldSet fieldSet) throws BindException {
BatchProcessEntity batchProcessEntity = new BatchProcessEntity();
batchProcessEntity.setEAddress(fieldSet.readString("address"));
//...etc
return batchProcessEntity;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.