在实际的业务场景中,数据文件并不一定是标准格式,可能是一些自定义格式的数据文件,这些文件的读取就需要改写读取器来实现。
首先回顾下上期DEMO中的文件读取器
package com.flight.neon.batch.demo.job.reder;
import com.flight.neon.batch.demo.job.entity.User;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
/**
* @author 这个码农不太萌
*/
@Component
public class DemoReader {
@Bean("userReader")
public FlatFileItemReader<User> userReader(){
ClassPathResource classPathResource = new ClassPathResource("text/user.txt");
FlatFileItemReader<User> flatFileItemReader = new FlatFileItemReader<>();
flatFileItemReader.setResource(classPathResource);
//设置跳过行数
flatFileItemReader.setLinesToSkip(1);
//数据转换
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames(new String[]{"userId","userName"});
DefaultLineMapper<User> defaultLineMapper = new DefaultLineMapper<>();
defaultLineMapper.setLineTokenizer(tokenizer);
defaultLineMapper.setFieldSetMapper(fieldSet -> {
User user = new User();
user.setUserId(fieldSet.readString("userId"));
user.setUserName(fieldSet.readString("userName"));
return user;
});
defaultLineMapper.afterPropertiesSet();
flatFileItemReader.setLineMapper(defaultLineMapper);
return flatFileItemReader;
}
}
此读取器只能读取按照逗号分隔的txt数据文件,若数据文件换一种格式,就会无法读取。
下面写个读取器的例子来实现读取单条数据为JSON格式的TXT文件(JSON文件是有专门读取器读的,但是JSON格式的TXT文件没有对应的读取器)
package com.flight.neon.batch.demo.job.reder;
import com.flight.neon.batch.demo.job.entity.User;
import com.google.gson.Gson;
import org.apache.commons.lang3.StringUtils;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.LineMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
/**
* @author 这个码农不太萌
*/
@Component
public class DemoReader {
@Bean("userReader")
public FlatFileItemReader<User> userReader(){
ClassPathResource classPathResource = new ClassPathResource("text/user.txt");
FlatFileItemReader<User> flatFileItemReader = new FlatFileItemReader<>();
flatFileItemReader.setResource(classPathResource);
LineMapper<User> lineMapper = (s, i) -> {
if (s!=null && StringUtils.isNotBlank(s)){
return new Gson().fromJson(s,User.class);
}else {
return null;
}
};
flatFileItemReader.setLineMapper(lineMapper);
return flatFileItemReader;
}
}
通过改写读取器的LineMapper可以实现多种格式的数据读取,至于数据的一些校验处理的工作就需要按照实际的数据内容及错误来进一步调整了