ItemProcessor
開発プロセスの後、私たちは多くの場合、データを読み取るために必要な、一連の操作を通じて、ビジネス・ロジック、および、書き込みデータ指定された永続化プロセスへ。春のバッチは、データ処理のための私達ItemProcessorインタフェースを提供します。
1.ItemProcessor:スプリングバッチプロセスデータ処理
2.ItemProcessorは、主にビジネスロジック、認証、フィルタリングなどに使用します
3.Springバッチは、I型を渡して、私たちItemProcessor <I、O>は、このインタフェースを提供し、その後、プロセッサのOによって処理されます
public interface ItemProcessor<I, O> {
O process(I item) throws Exception;
}
私たちは、あなたがトラフィックを処理するために、複数のプロセッサのステップのために使用することができる、CompositeItemProcessor豆を構築することができます。
私たちは、豆を構築し、複数のプロセッサCompositeItemProcessorを保存し、その後ステップと結合することができます。
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private DataSource dataSource;
@Autowired
private ItemProcessor<Customer, Customer> firstNameUpperCaseProcessor;
@Autowired
private ItemProcessor<Customer, Customer> idFilterProcessor;
@Bean
public Job processorDemoJob() throws Exception {
return jobBuilderFactory.get("processorDemoJob")
.start(processorDemoStep())
.build();
}
@Bean
public Step processorDemoStep() throws Exception {
return stepBuilderFactory.get("processorDemoStep")
.<Customer,Customer>chunk(100)
.reader(dbJdbcDemoReader())
.processor(processorDemoProcessor())
.writer(flatFileDemoFlatFileWriter())
.build();
}
@Bean
public CompositeItemProcessor<Customer,Customer> processorDemoProcessor(){
CompositeItemProcessor<Customer,Customer> processor = new CompositeItemProcessor<>();
// 多种处理方式
List<ItemProcessor<Customer,Customer>> list = new ArrayList<>();
list.add(firstNameUpperCaseProcessor);
list.add(idFilterProcessor);
processor.setDelegates(list);
return processor;
}
@Bean
@StepScope
public JdbcPagingItemReader<Customer> dbJdbcDemoReader() {
JdbcPagingItemReader<Customer> reader = new JdbcPagingItemReader<>();
reader.setDataSource(this.dataSource);
reader.setFetchSize(100);
reader.setRowMapper((rs,rowNum)->{
return Customer.builder().id(rs.getLong("id"))
.firstName(rs.getString("firstName"))
.lastName(rs.getString("lastName"))
.birthdate(rs.getString("birthdate"))
.build();
});
MySqlPagingQueryProvider queryProvider = new MySqlPagingQueryProvider();
queryProvider.setSelectClause("id, firstName, lastName, birthdate");
queryProvider.setFromClause("from Customer");
Map<String, Order> sortKeys = new HashMap<>(1);
sortKeys.put("id", Order.ASCENDING);
queryProvider.setSortKeys(sortKeys);
reader.setQueryProvider(queryProvider);
return reader;
}
@Bean
public FlatFileItemWriter<Customer> flatFileDemoFlatFileWriter() throws Exception {
FlatFileItemWriter<Customer> itemWriter = new FlatFileItemWriter<>();
String path = File.createTempFile("customerInfo",".data").getAbsolutePath();
System.out.println(">> file is created in: " + path);
itemWriter.setResource(new FileSystemResource(path));
itemWriter.setLineAggregator(new MyCustomerLineAggregator());
itemWriter.afterPropertiesSet();
return itemWriter;
}
特定を達成ItemProcessor
@Component
public class FirstNameUpperCaseProcessor implements ItemProcessor<Customer,Customer> {
@Override
public Customer process(Customer item) throws Exception {
// FirstName转大写
return new Customer(item.getId(),item.getFirstName().toUpperCase(),item.getLastName(),
item.getBirthdate());
}
}
@Component
public class IdFilterProcessor implements ItemProcessor<Customer,Customer> {
@Override
public Customer process(Customer item) throws Exception {
// 过滤id为基数的数据
if (item.getId() % 2 == 0){
return item;
} else {
return null;
}
}
}
出力
参考:
https://blog.csdn.net/wuzhiwei549/article/details/88622281