springbatch
springbatch
job的创建使用
job:作业,是批处理中的核心概念,是batch操作的基础单元,每个job由多个step组成
step:步骤,任务完成的节点
每个job是由JobBuildFactory创建,每个step是由StepBuildFactory创建
示例:
``
@Configuration
@EnableBatchProcessing //开启批处理
public class JobConfiguration {/**
* 创建任务对象的对象
*/
@Autowired
private JobBuilderFactory jobBuilderFactory; /**
* 创建步骤对象的对象
*/
@Autowired
private StepBuilderFactory stepBuilderFactory; @Bean
public Job helloJob(){ return jobBuilderFactory.get("helloJob").start(helloStep1()).build();
} @Bean
public Step helloStep1(){ return stepBuilderFactory.get("helloStep1").tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("hello world");
return RepeatStatus.FINISHED;
}
}).build();
}
}
``
从数据库读取
JdbcPagingItemReader
. 设置数据源
. 设置查询条件
. 将查询结果映射成实体类
MySqlPagingQueryProvider // mysql分页查询支持器
代码示例:
JdbcPagingItemReader<User> jdbcPagingItemReader = new JdbcPagingItemReader<>();
jdbcPagingItemReader.setDataSource(dataSource);
jdbcPagingItemReader.setFetchSize(3);//每次从数据库拉取条数 //设置查询条件
MySqlPagingQueryProvider pagingQueryProvider = new MySqlPagingQueryProvider();
pagingQueryProvider.setSelectClause("id,name,password");
pagingQueryProvider.setFromClause("user"); Map<String, Order> orderMap = new HashMap<>();
orderMap.put("password",Order.DESCENDING);//设置排序字段
pagingQueryProvider.setSortKeys(orderMap);
jdbcPagingItemReader.setQueryProvider(pagingQueryProvider); //设置行映射器
jdbcPagingItemReader.setRowMapper(new RowMapper<User>() {
@Override
public User mapRow(ResultSet resultSet, int i) throws SQLException {
User user = new User();
user.setId(resultSet.getInt(1));
user.setName(resultSet.getString(2));
user.setPassword(resultSet.getString(3));
return user;
}
});
return jdbcPagingItemReader;
从txt文件中获取数据
- FlatFileItemReader
- DelimitedLineTokenizer //行分词器
- DefaultLineMapper //行映射器,将一行数据映射成对应的实体
- defaultLineMapper.setLineTokenizer(delimitedLineTokenizer);
- flatFileItemReader.setLineMapper(defaultLineMapper);
- 代码示例:
```
FlatFileItemReader<Hospital> flatFileItemReader = new FlatFileItemReader<>();
flatFileItemReader.setEncoding("utf-8");
flatFileItemReader.setLinesToSkip(1);//跳过第一行
flatFileItemReader.setResource(new ClassPathResource("/data/hospital.txt"));
//解析数据 按行分词
DelimitedLineTokenizer delimitedLineTokenizer = new DelimitedLineTokenizer();
delimitedLineTokenizer.setNames("id","org_name","org_type","addr","allow_no","cert_dept",
"start_valid_date","end_invalid_date");
//行映射器
DefaultLineMapper<Hospital> defaultLineMapper = new DefaultLineMapper<>();
defaultLineMapper.setLineTokenizer(delimitedLineTokenizer);
defaultLineMapper.setFieldSetMapper(new FieldSetMapper<Hospital>() {
@Override
public Hospital mapFieldSet(FieldSet fieldSet) throws BindException {
Hospital hospital = new Hospital();
hospital.setId(fieldSet.readInt("id"));
hospital.setAddr(fieldSet.readString("addr"));
hospital.setAllowNo(fieldSet.readString("allow_no"));
hospital.setCertDept(fieldSet.readString("cert_dept"));
hospital.setEndValidDate(fieldSet.readString("end_invalid_date"));
hospital.setOrgName(fieldSet.readString("org_name"));
hospital.setOrgType(fieldSet.readString("org_type"));
hospital.setStartValidDate(fieldSet.readString("start_valid_date"));
return hospital;
}
});
defaultLineMapper.afterPropertiesSet();
flatFileItemReader.setLineMapper(defaultLineMapper);
return flatFileItemReader;
```
从xml中读取数据
StaxEventItemReader xml读取器
pom引入jar包
``
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.11.1</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
``
xstream实现xml转对象
spring-oxm遵循xstream接口规范,实现xml转对象
代码示例:
``
@Bean
public ItemReader<User> xmlItemReader() { StaxEventItemReader<User> staxEventItemReader = new StaxEventItemReader<>();
staxEventItemReader.setFragmentRootElementName("user");//设置根标签
staxEventItemReader.setResource(new ClassPathResource("/data/user.xml"));//设置文件路径 //将xml转成实体对象
XStreamMarshaller xStreamMarshaller = new XStreamMarshaller();
Map<String,Class> alias = new HashMap<>();
alias.put("user",User.class);//key 为根标签,class是key标签下的所有标签映射到的对象
xStreamMarshaller.setAliases(alias); staxEventItemReader.setUnmarshaller(xStreamMarshaller); return staxEventItemReader;
}
``
多文件读取
MultiResourceItemReader
多文件读取,其实就是一个一个文件读取
MultiResourceItemReader需要设置文件读取代理,待读取文件资源
代码示例:
``
@Value("classpath:/data/file*.txt")
private Resource[] resources;@Bean
public MultiResourceItemReader multiFileItemReader() {MultiResourceItemReader<Hospital> multiResourceItemReader = new MultiResourceItemReader<>();
//多文件读取,其实也是一个一个文件进行读取,需要设置文件读取器
multiResourceItemReader.setDelegate(flatFileItemReader());
multiResourceItemReader.setResources(resources);
return multiResourceItemReader;
}
@Bean
public FlatFileItemReader flatFileItemReader(){
FlatFileItemReader flatFileItemReader = new FlatFileItemReader<>();
flatFileItemReader.setEncoding("utf-8");DelimitedLineTokenizer delimitedLineTokenizer = new DelimitedLineTokenizer();
delimitedLineTokenizer.setDelimiter(",");
delimitedLineTokenizer.setNames("id","org_name","org_type","addr","allow_no","cert_dept",
"start_valid_date","end_invalid_date"); DefaultLineMapper<Hospital> defaultLineMapper = new DefaultLineMapper<>();
defaultLineMapper.setLineTokenizer(delimitedLineTokenizer);
defaultLineMapper.setFieldSetMapper(new FieldSetMapper<Hospital>() {
@Override
public Hospital mapFieldSet(FieldSet fieldSet) throws BindException {
Hospital hospital = new Hospital();
hospital.setStartValidDate(fieldSet.readString("start_valid_date"));
hospital.setOrgType(fieldSet.readString("org_type"));
hospital.setOrgName(fieldSet.readString("org_name"));
hospital.setEndValidDate(fieldSet.readString("end_invalid_date"));
hospital.setCertDept(fieldSet.readString("cert_dept"));
hospital.setAllowNo(fieldSet.readString("allow_no"));
hospital.setAddr(fieldSet.readString("addr"));
hospital.setId(fieldSet.readInt("id"));
return hospital;
}
}); flatFileItemReader.setLineMapper(defaultLineMapper); return flatFileItemReader;
}
``
从文件中读取,并写入到数据库
JdbcBatchItemWriter
代码示例:
@Bean
public ItemWriter<Hospital> jdbcBatchItemWriter() {
JdbcBatchItemWriter<Hospital> jdbcBatchItemWriter = new JdbcBatchItemWriter<>();
jdbcBatchItemWriter.setDataSource(dataSource);
jdbcBatchItemWriter.setSql(
"INSERT INTO `hospital` (`id`, `org_name`, `org_type`, `addr`, `allow_no`, `cert_dept`, `start_valid_date`, `end_invalid_date`) " +
"VALUES (:id, :orgName, :orgType, :addr, :allowNo, :certDept, :startValidDate, :endValidDate)"
);
//将对象属性值映射到sql参数中
jdbcBatchItemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
return jdbcBatchItemWriter;
}
从数据库读取,写入到普通文件
FlatItemFileWriter
代码示例:
@Bean
public ItemWriter<? super Hospital> flatFileItemWriter() { FlatFileItemWriter<Hospital> flatFileItemWriter = new FlatFileItemWriter<>();
flatFileItemWriter.setEncoding("utf-8");
//设置存放数据的文件路径
flatFileItemWriter.setResource(new FileSystemResource("f:/hospital_generate.txt")); flatFileItemWriter.setLineAggregator(new LineAggregator<Hospital>() {
ObjectMapper objectMapper = new ObjectMapper();
@Override
public String aggregate(Hospital item) {
String result = null;
try {
result = objectMapper.writeValueAsString(item);//将对象转json字符串
} catch (JsonProcessingException e) {
e.printStackTrace();
} return result;
}
});
return flatFileItemWriter; }
从数据库读取并写入到xml文件
StaxEventItemWriter
XstreamMarshaller - xml标签元素与实体对象映射
代码示例
@Bean
public ItemWriter<? super Hospital> xmlFileItemWriter() {
StaxEventItemWriter<Hospital> staxEventItemWriter = new StaxEventItemWriter<>();
staxEventItemWriter.setEncoding("utf-8");
staxEventItemWriter.setResource(new FileSystemResource("f:/hospital.xml"));
staxEventItemWriter.setRootTagName("hospitals"); //XML标签与实体对象映射
Map<String,Class<Hospital>> alias = new HashMap<>();
alias.put("hospital",Hospital.class); XStreamMarshaller xStreamMarshaller = new XStreamMarshaller();
xStreamMarshaller.setAliases(alias); staxEventItemWriter.setMarshaller(xStreamMarshaller); return staxEventItemWriter; }
springbatch的更多相关文章
- springbatch操作CSV文件
一.需求分析 使用Spring Batch对CSV文件进行读写操作: 读取一个含有四个字段的CSV文件(id, name, age, score), 对文件做简单的处理, 然后输出到还有一个csv文件 ...
- SpringBatch的核心组件JobLauncher和JobRepository
Spring Batch的框架包括启动批处理作业的组件和存储Job执行产生的元数据.因此只需掌握配置这个基础框架在批处理应用程序中即启动Jobs并存储Job元数据. 组件:Job Launcher和J ...
- SpringBatch简介
spring Batch是一个轻量级的.完善的批处理框架,旨在帮助企业建立健壮.高效的批处理应用.SpringBatch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使 ...
- spring-boot-oracle spring-batch
Install/Configure Oracle express Oracle xe installer for linux (I don't care if you're running linux ...
- springbatch的封装与使用
springbatch 主要实现批量数据的处理,我对batch进行的封装,提出了jobBase类型,具体job需要实现它即可.Spring Batch 不仅提供了统一的读写接口.丰富的任务处理方式.灵 ...
- SpringBatch的流程简介
SpringBatch的流程图如下: 每个Batch都会包含一个Job.Job就像一个容器,这个容器装了若干Step,Batch中实际干活的也就是这些Step,至于Step干什么活,无外乎读取数据,处 ...
- SpringBatch的初步了解
一.SpringBatch是一个批处理的框架,作为一个Spring组件,提供了通过使用Spring的依赖注入来处理批处理的条件. 什么是批处理呢? 在现代企业应用当中,面对复杂的业务以及海量的数据,除 ...
- SpringBatch Sample (五)(复合格式文件的读、多文件的写)
前面关于Spring Batch的文章,讲述了SpringBatch对CSV文件的读写操作.对XML文件的操作,以及对固定长格式文件的操作.这些事例,同一个Reader读取的都是相同格式的数据,最终写 ...
- SpringBatch Sample (四)(固定长格式文件读写)
前篇关于Spring Batch的文章,讲述了Spring Batch 对XML文件的读写操作. 本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对固定长格式文件的读写操作.实例延 ...
- SpringBatch Sample (三)(XML文件操作)
前篇关于Spring Batch的文章,讲述了Spring Batch 对CSV文件的读写操作. 本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对XML文件的读写操作.实例流程是 ...
随机推荐
- Evaluating Automatically Generated timelines from the Web (paper1)
摘要: 问题:There is a need that 以一个更全面/更综合的方式来展现搜索结果.对此,作者正在开发一个系统,called “Cronopath”,这个系统将产生一个时间线,通过决定每 ...
- XDebug调试
安装 访问Xdebug 点击download 找到RELEASES,点击 custom installation instructions. 在白色框框内填入phpinfo()出来的源码 点击Anal ...
- 使用寄存器点亮LED(第1节)—GPIO功能框图讲解
GPIO简介 GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚, STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯.控制以及数据采集的功能.STM32 ...
- 在一台服务器上启动多个Broker
1:把整个conf文件夹复制一份,比如叫做conf22:修改里面的activemq.xml文件(1)里面的brokerName 不能跟原来的重复(2)数据存放的文件名称不能重复,比如:<kaha ...
- 通过pip命令导出和导入Python环境安装包
我们在开发完代码后,一般需要将依赖包导出,然后在移植到其他系统使去安装,保证环境正常 导出Python环境安装包[root@bogon ~]# pip freeze > packages.t ...
- BZOJ4566 HAOI2016找相同字符(后缀自动机)
对第一个串建SAM,第二个串在上面跑,记录当前前缀匹配的最长后缀长度l,每次考虑当前前缀的贡献,对于当前所在节点显然是|right|*(l-len[fa]),而对于其parent树上所有祖先的贡献显然 ...
- qt翻译和国际化的探讨。
这段时间一直都在怼qt的国际化,以前也接触过国际化,但是感觉不是那么的深刻,这次是因为一个项目要做一个国际化的版本,代码里面是不能出现中文的,所以就翻译了一下.qt用的是4.8.6 64位的,IDE( ...
- hdu 6153 思维+扩展kmp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153 扩展kmp不理解的看下:http://www.cnblogs.com/z1141000271/p ...
- 开发环境,不用每次都ant自动编译
公司所用ant技术,每次改个java文件,配置文件都需要重新编译一次发布 在实际搭环境的过程发现,ant就是把项目目录下的文件编译成功后的搬移到到 ,Tomcat 运行环境配置的目录下,凡是修改的文件 ...
- Java Web-JSTL
Java Web-JSTL 概念 Java Server Pages Tag Library:JSP标准标签库 是由Apache组织提供的开源.免费JSP标签 用于简化和替换JSP页面上的Java代码 ...