前言
清华美院一名女学生称男同学通过包的掩护摸自己的 PP 并将男同学的身份信息公开到社交媒体, 导致男同学险些社会性死亡, 后来查了监控才证明了男同学的清白.
Spring Batch 可校验性
我们经常需要大量的读取数据, 其中有些数据可能不符合我们的预期, 比如从接口读了个用户列表, 年龄字段存在负数, 这种可能就需要中断程序或者跳过处理, 接着处理下一条
Spring Batch 可校验性例子
reader 和 writer 都是原来的, 我们重新写个 processor:
@Componentpublic class QingGirlProcessor implements ItemProcessor<Girl, String> { @Override public String process(Girl girl) throws Exception { return girl.getName() + "说被摸了PP"; }}
使用组合将验证的 processor 和上面的业务的 processor 串联起来:
@Configurationpublic class ProcessorConfig { @Autowired private QingGirlProcessor qingGirlProcessor; @Bean public BeanValidatingItemProcessor<Girl> girlBeanValidatingItemProcessor() throws Exception { BeanValidatingItemProcessor<Girl> validator = new BeanValidatingItemProcessor<>(); validator.setFilter(true); validator.afterPropertiesSet(); return validator; } @Bean public ItemProcessor<Girl, String> girlStringItemProcessor() throws Exception { List<ItemProcessor> list = new ArrayList<>(); list.add(girlBeanValidatingItemProcessor()); list.add(qingGirlProcessor); CompositeItemProcessor compositeItemProcessor = new CompositeItemProcessor<>(); compositeItemProcessor.setDelegates(list); compositeItemProcessor.afterPropertiesSet(); return compositeItemProcessor; }}
任务配置:
final String JOB_NAME = "demo4QingGirl";List<Girl> girlList = new ArrayList<>();for (int i = 0; i < 10; i++) { girlList.add(i % 2 == 0 ? new Girl() : new Girl("唐*靖"));}final ListReader<Girl> reader = new ListReader<>(girlList);final Job girlJob = jobBuilderFactory.get(JOB_NAME) .flow(stepBuilderFactory.get(JOB_NAME) .<Girl, String>chunk(2).reader(reader) .processor(girlStringItemProcessor).writer(printWriter).build()) .end().build();jobLauncher.run(girlJob, new JobParametersBuilder() .addDate("start_time", new Date()).toJobParameters());
输出:
唐*靖说被摸了PP唐*靖说被摸了PP唐*靖说被摸了PP唐*靖说被摸了PP唐*靖说被摸了PP
总共十个只输出了五个这就是我们的 Girl 类的作用了:
@Data@AllArgsConstructor@NoArgsConstructorpublic class Girl { @NotBlank private String name;}
这样就能保证只处理符合预期的数据了
微信公众号: