SpringBatch从入门到实战(九):ItemStreamReader

news/2025/1/12 22:01:44/
public interface ItemStream {// step执行之前执行void open(ExecutionContext var1) throws ItemStreamException;// 成功处理每一批chunk之后执行void update(ExecutionContext var1) throws ItemStreamException;// 整个step执行完之后才会执行void close() throws ItemStreamException;
}

在这里插入图片描述

一:user.csv

1,monday,10,上海市,浦东新区
2,zhangsan,20,北京市,朝阳区
3,xxx,30,深圳市,宝安区
4,wangwu,31,上海市,浦东新区
5,huihui,32,上海市,浦东新区

二:ItemStreamReader


/*** 异常处理和重启*/
@Component
public class MyItemReader implements ItemStreamReader<UserInfo> {private FlatFileItemReader<UserInfo> flatFileItemReader = new FlatFileItemReader();private int currentLine = 0;// 是否允许重启private boolean restart = false;private ExecutionContext executionContext;public MyItemReader() {flatFileItemReader.setResource(new ClassPathResource("static/user.csv"));DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();tokenizer.setNames("id", "username", "age", "city", "area");BeanWrapperFieldSetMapper<UserInfo> fieldSetMapper = new BeanWrapperFieldSetMapper<>();fieldSetMapper.setTargetType(UserInfo.class);DefaultLineMapper<UserInfo> defaultLineMapper = new DefaultLineMapper<>();defaultLineMapper.setLineTokenizer(tokenizer);defaultLineMapper.setFieldSetMapper(fieldSetMapper);defaultLineMapper.afterPropertiesSet();flatFileItemReader.setLineMapper(defaultLineMapper);}@Overridepublic void open(ExecutionContext executionContext) throws ItemStreamException {this.executionContext = executionContext;if (executionContext.containsKey("currentLine")) {// 6.作业第二次执行this.currentLine = executionContext.getInt("currentLine");this.restart = true;} else {// 1.作业第一次先执行this.currentLine = 0;executionContext.put("currentLine", this.currentLine);System.err.println("start reading from line:" + this.currentLine + 1);}System.err.println("step执行之前");}@Overridepublic UserInfo read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {UserInfo userInfo = null;this.currentLine++;if (restart) {// 7.作业第二次执行:跳过成功的行flatFileItemReader.setLinesToSkip(this.currentLine - 1);restart = false;System.err.println("restart from line:" + this.currentLine);}// 2.作业第一次执行读数据// 8.作业第二次执行读(从成功的行开始读)flatFileItemReader.open(this.executionContext);userInfo = flatFileItemReader.read();if (userInfo != null && userInfo.getUsername().equals("xxx")) {// 4.作业第一次 下一轮Chunk遇到xxx报错throw new RuntimeException("read userinfo id=" + userInfo.getId() + " exception");}return userInfo;}@Overridepublic void update(ExecutionContext executionContext) throws ItemStreamException {// 3.读完一轮chunkSize后执行// 4.读第二轮ChunkSize后执行executionContext.put("currentLine", this.currentLine);System.err.println("读完一个ChunkSize执行,读的过程中报错也会执行");}@Overridepublic void close() throws ItemStreamException {// 5.步骤执行结束执行System.err.println("Step最后执行");}
}

三:config

@Configuration
public class RestartJobConfig {@Autowiredprivate JobBuilderFactory jobBuilderFactory;@Autowiredprivate StepBuilderFactory stepBuilderFactory;@Autowiredprivate MyItemReader myItemReader;@Autowiredprivate MyItemWriter myItemWriter;@Beanpublic Job restartJob() {return jobBuilderFactory.get("myRestartJob2").start(restartStep()).build();}@Beanpublic Step restartStep() {return stepBuilderFactory.get("restartStep").<UserInfo, UserInfo>chunk(2).reader(myItemReader).writer(myItemWriter).build();}
}

四:controller

@RestController
@RequestMapping("/job")
public class JobController {@Autowiredprivate JobLauncher jobLauncher;@Autowiredprivate Job restartJob;@RequestMapping("/start")public ExitStatus start() throws Exception {JobExecution jobExecution = jobLauncher.run(restartJob, new JobParameters());return jobExecution.getExitStatus();}
}

第一次执行完,将第3条数据的用户名xxx随便改成其它值,然后重启服务,尝试第二次继续执行。
在这里插入图片描述


http://www.ppmy.cn/news/401187.html

相关文章

新魔百和UNT402A免拆机破解(附教程)

九联UNT402A刷机教程指南 今天跟大家分享下关于九联UNT402A刷机教程&#xff0c; UNT402A与UNT之前型号有明显区别&#xff0c; 就是采用的处理器不在是海思处理器&#xff0c; 取而代之的是晶晨处理器&#xff0c;下面讲讲如何刷机 下载地址&#xff1a; 百度链接&#xff1…

魔百和CM311-1a YST免拆机卡刷精简固件

固件说明&#xff1a; 1、 魔百和CM311-1a YST测试可用&#xff0c;其它型号自行测试&#xff0c;请慎重使用&#xff1b; 2、支持原装遥控器&#xff0c;语音蓝牙遥控器&#xff1b; 3、固件压缩包有刷机教程&#xff0c;请一定仔细阅读。 4、该固件内置应用商店&#xff0c;可…

魔百和CM201-1-YS易视腾代工-免拆机-线刷固件包

固件特点&#xff1a; 1、基于官方包改造而来&#xff0c;实现保留原机三码方式、无线、网线DHCP正常即插即用&#xff1b; 2、集成当贝桌面&#xff0c;首页、菜单、设置键及常用功能键功能正常&#xff0c;支持更多遥控&#xff1b; 3、纯净系统&#xff0c;没有任何多余的…

中9遥控器维修记

前天我的杂牌中9遥控器不慎摔倒地上&#xff0c;捡起来再用的时候已经不能遥控了&#xff0c;没遥控可不好办啊&#xff0c;虽然可以通过机顶盒手动换台&#xff0c;但是还有些功能必须靠遥控器才能使用啊&#xff0c;要是买一个吧&#xff0c;这种杂牌的遥控器很难买到&#x…

Jmeter性能测试步骤入门

目录 前言&#xff1a; 一、Jmeter简介 1 概述 2 JMeter支持的协议 二、Jmeter实现性能测试 第一步&#xff1a;配置jdk环境 第二步&#xff1a;下载jmeter 第三步&#xff1a;启动Jmeter 四、一个http还除了上述http请求中的请求行和请求体&#xff0c;还包含请求头&#xff…

同屏电视背景氛围灯,硬核拆机,产品运行逻辑说明

斥巨资购买一个同屏电视背景氛围灯产品&#xff0c;话不多说&#xff0c;直入主题直接拆。 咱们先来看看效果&#xff0c;通过电脑投屏到显示屏上&#xff0c;如下图所示&#xff0c;整个产品的连接器插口定义 我们从右边至左开始进行讲解。第一个连接器是提供整个产品供电的PC…

移动九联unt402H-免拆机-卡刷-刷机固件及教程

魔百盒移动九联unt402H JL卡刷包支持WiFi驱动uwe5621 免拆机强刷包及教程 固件特点&#xff1a; 1、调出原厂固件屏蔽的wifi&#xff0c;开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 2、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升级&#xff1b;修…

咪咕MGV2000,JZ代工-免拆机-U盘刷机固件及教程

咪咕MGV2000_九州代工(JZ)_晶晨S905L-B_免拆机_U盘刷机固件 固件说明&#xff1a; 本固件为魔百盒咪咕二代MGV2000运营商盒子&#xff0c;&#xff08;JZ)九州代工&#xff0c;主控芯片为晶晨S905L-B&#xff0c;免拆机-U盘-刷机固件 1、请分辨包装盒或盒子底部的JZ标志&a…