前言
最近蚂蚁金服变成了 '马已今服' 了, 我的朋友圈小伙伴们的表现有捶胸顿足的, 还有转发网抑云的我不配, 没这命这样的歌, 积极的动态也就是上市从来不是最终的目标, 不过实话讲, 我还是希望事情能向好的方向发展, 下面我们通过 SpringBatch 的跳过策略来讲讲这个问题
Spring Batch 可跳过性
因为我们处理数据的时候有不同的需求, 比如有 100 条数据, 处理到第 6 条的时候失败了, 整个 step 都终止了, 这个可能是大多数批处理任务不希望看到的, 大多数的批处理任务是希望当前处理失败的记录下来, 单据补偿, 大多数的数据先跑过去, 这时候就要配置跳过策略了
Spring Batch 可跳过性例子
假如福报厂的各个公司都要上一遍市, 我们定义一下这个读, 处理和写的过程
读:
@Data@NoArgsConstructorpublic class ListReader<T> implements ItemReader<T> { private List<T> sourceList; private int index = 0; public ListReader(List<T> sourceList) { this.sourceList = sourceList; } @Override public T read() throws Exception { return sourceList.size() > index ? sourceList.get(index++) : null; }}
复制代码
处理:
@Componentpublic class FubaoProcessor implements ItemProcessor<Company,String> { @Override public String process(Company company) throws Exception { if(Objects.equals(company.getName(),"蚂蚁金服")) { throw new RuntimeException("暂缓上市"); } if(Objects.equals(company.getName(),"盒马")) { return null; } return company.getName() + "上市成功! 恭喜员工财务自由"; }}
复制代码
写:
@Componentpublic class FubaoWriter implements ItemWriter<String> { @Override public void write(List<? extends String> list) throws Exception { list.stream().forEach(item -> { if (item.contains("大文娱")) { throw new NonSkippableWriteException("上市异常", new RuntimeException("异常异常")); } System.out.println(item); }); }}
复制代码
拼装:
final String JOB_NAME = "demo4Ali";List<Company> commodityList = Arrays.asList(new Company("蚂蚁金服"), new Company("菜鸟网络"), new Company("阿里云"), new Company("盒马"), new Company("大文娱"), new Company("飞猪"), new Company("阿里健康") );final ListReader<Company> reader = new ListReader<>(commodityList);final Job girlJob = jobBuilderFactory.get(JOB_NAME) .flow(stepBuilderFactory.get(JOB_NAME) .<Company, String>chunk(2).reader(reader) .processor(fubaoProcessor).writer(fubaoWriter).faultTolerant() .skipPolicy(new AlwaysSkipItemSkipPolicy()).listener(new SkipListener<Company, String>() { @Override public void onSkipInRead(Throwable throwable) { System.out.println("onSkipInRead: " + throwable); } @Override public void onSkipInProcess(Company company, Throwable throwable) { System.out.println("onSkipInProcess: " + company.getName() + "暂缓上市"); } @Override public void onSkipInWrite(String s, Throwable throwable) { System.out.println("onSkipInWrite: <del>" + s + "</del>上市失败"); } }).build()) .end().build();jobLauncher.run(girlJob, new JobParametersBuilder() .addDate("start_time", new Date()).toJobParameters());
复制代码
表现:
菜鸟网络上市成功! 恭喜员工财务自由onSkipInProcess: 蚂蚁金服暂缓上市阿里云上市成功! 恭喜员工财务自由飞猪上市成功! 恭喜员工财务自由onSkipInWrite: <del>大文娱上市成功! 恭喜员工财务自由</del>上市失败阿里健康上市成功! 恭喜员工财务自由
复制代码
Spring课后作业
- 尝试自定义跳过策略替换掉 AlwaysSkipItemSkipPolicy
微信公众号: codog代码狗