前言
清华美院一名女学生称男同学通过包的掩护摸自己的 PP 并将男同学的身份信息公开到社交媒体, 导致男同学险些社会性死亡, 后来查了监控才证明了男同学的清白.
Spring Batch 可校验性
我们经常需要大量的读取数据, 其中有些数据可能不符合我们的预期, 比如从接口读了个用户列表, 年龄字段存在负数, 这种可能就需要中断程序或者跳过处理, 接着处理下一条
Spring Batch 可校验性例子
reader 和 writer 都是原来的, 我们重新写个 processor:
@Component
publicclassQingGirlProcessorimplementsItemProcessor{
@Override
publicStringprocess(Girl girl)throwsException{
returngirl.getName() +"说被摸了PP";
}
}
使用组合将验证的 processor 和上面的业务的 processor 串联起来:
@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;
}
}
任务配置:
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;
}
这样就能保证只处理符合预期的数据了