前言
清華美院一名女學(xué)生稱男同學(xué)通過包的掩護摸自己的 PP 并將男同學(xué)的身份信息公開到社交媒體, 導(dǎo)致男同學(xué)險些社會性死亡, 后來查了監(jiān)控才證明了男同學(xué)的清白.
Spring Batch 可校驗性
我們經(jīng)常需要大量的讀取數(shù)據(jù), 其中有些數(shù)據(jù)可能不符合我們的預(yù)期, 比如從接口讀了個用戶列表, 年齡字段存在負數(shù), 這種可能就需要中斷程序或者跳過處理, 接著處理下一條
Spring Batch 可校驗性例子
reader 和 writer 都是原來的, 我們重新寫個 processor:
@Component
publicclassQingGirlProcessorimplementsItemProcessor{
@Override
publicStringprocess(Girl?girl)throwsException{
returngirl.getName()?+"說被摸了PP";
}
}
使用組合將驗證的 processor 和上面的業(yè)務(wù)的 processor 串聯(lián)起來:
@Configuration
publicclassProcessorConfig{
@Autowired
privateQingGirlProcessor?qingGirlProcessor;
@Bean
publicBeanValidatingItemProcessorgirlBeanValidatingItemProcessor()throwsException{
BeanValidatingItemProcessor?validator?=newBeanValidatingItemProcessor<>();
validator.setFilter(true);
validator.afterPropertiesSet();
returnvalidator;
}
@Bean
publicItemProcessorgirlStringItemProcessor()throwsException{
List?list?=newArrayList<>();
list.add(girlBeanValidatingItemProcessor());
list.add(qingGirlProcessor);
CompositeItemProcessor?compositeItemProcessor?=
newCompositeItemProcessor<>();
compositeItemProcessor.setDelegates(list);
compositeItemProcessor.afterPropertiesSet();
returncompositeItemProcessor;
}
}
任務(wù)配置:
finalString?JOB_NAME?="demo4QingGirl";
List?girlList?=newArrayList<>();
for(inti?=0;?i?<10;?i++)?{
girlList.add(i?%2==0?newGirl()?:newGirl("唐*靖"));
}
finalListReader?reader?=newListReader<>(girlList);
finalJob?girlJob?=?jobBuilderFactory.get(JOB_NAME)
.flow(stepBuilderFactory.get(JOB_NAME)
.chunk(2).reader(reader)
.processor(girlStringItemProcessor).writer(printWriter).build())
.end().build();
jobLauncher.run(girlJob,newJobParametersBuilder()
.addDate("start_time",newDate()).toJobParameters());
輸出:
唐*靖說被摸了PP
唐*靖說被摸了PP
唐*靖說被摸了PP
唐*靖說被摸了PP
唐*靖說被摸了PP
總共十個只輸出了五個這就是我們的 Girl 類的作用了:
@Data
@AllArgsConstructor
@NoArgsConstructor
publicclassGirl{
@NotBlank
privateString?name;
}
這樣就能保證只處理符合預(yù)期的數(shù)據(jù)了