SpringBatch - Validate, 竟然敢摸清華女學生

current_person 發表於 2020-11-21

前言

清華美院一名女學生稱男同學通過包的掩護摸自己的 PP 並將男同學的身份資訊公開到社交媒體, 導致男同學險些社會性死亡, 後來查了監控才證明了男同學的清白.

Spring Batch 可校驗性

我們經常需要大量的讀取資料, 其中有些資料可能不符合我們的預期, 比如從介面讀了個使用者列表, 年齡欄位存在負數, 這種可能就需要中斷程式或者跳過處理, 接著處理下一條

Spring Batch 可校驗性例子

reader 和 writer 都是原來的, 我們重新寫個 processor:

@Component
public class QingGirlProcessor implements ItemProcessor<Girl, String> {

    @Override
    public String process(Girl girl) throws Exception {
        return girl.getName() + "說被摸了PP";
    }
}

使用組合將驗證的 processor 和上面的業務的 processor 串聯起來:

@Configuration
public 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
@NoArgsConstructor
public class Girl {

    @NotBlank
    private String name;
}

這樣就能保證只處理符合預期的資料了

微信公眾號:
在這裡插入圖片描述