spring batch的使用和定时器Quart的使用
Spring Batch是一个基于Spring的企业级批处理框架,它通过配合定时器Quartz来轻易实现大批量的数据读取或插入,并且全程自动化,无需人员管理。
在使用spring batch之前,得对spring batch的流程有一个基本了解

每个batch它都包含了一个job,而一个job中却有可能包含多个step,整个batch中干活的是step,batch主要是用来对数据的操作,所以step就有三个操作数据的东西,一个是ItemReader用来读取数据的,一个是ItemProcessor用来处理数据的,一个是ItemWriter用来写数据(可以是文件也可以是插入sql语句),JobLauncher用来启动Job,JobRepository是上述处理提供的一种持久化机制,它为JobLauncher,Job,和Step实例提供CRUD操作。
pom.xml 三个batch的jar包
- <span style="white-space:pre;"> </span><dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-batch-core</artifactId>
- <version>2.1.8.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-batch-infrastructure</artifactId>
- <version>2.1.8.RELEASE</version>
- <span style="white-space:pre;"> </span></dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-batch-test</artifactId>
- <version>2.1.8.RELEASE</version>
- </dependency>
batch.xml
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:batch="http://www.springframework.org/schema/batch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/batch
- http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
- ">
- <bean id="jobLauncher"
- class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
- <property name="jobRepository" ref="jobRepository" />
- </bean>
- <bean id="jobRepository"
- class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
- <property name="validateTransactionState" value="false" />
- </bean>
- <span style="white-space:pre;"> </span><!--一个job-->
- <batch:job id="writerteacherInterview">
- <batch:step id="teacherInterview">
- <batch:tasklet>
- <batch:chunk reader="jdbcItemReaderTeacherInterview" writer="teacherInterviewItemWriter"
- processor="teacherInterviewProcessor" commit-interval="10">
- </batch:chunk>
- </batch:tasklet>
- </batch:step>
- </batch:job>
- <!--job的读取数据操作-->
- <bean id="jdbcItemReaderTeacherInterview"
- class="org.springframework.batch.item.database.JdbcCursorItemReader"
- scope="step">
- <property name="dataSource" ref="dataSource" />
- <property name="sql"
- value="select distinct teacherName ,count(teacherName) as num from examininterviewrecord where pdate >'${detail_startime}' and pdate < '${detail_endtime}' GROUP BY teacherName " />
- <property name="rowMapper" ref="teacherInterviewMapper">
- </property>
- </bean>
- </beans>
读取数据 teacherInterviewMapper
- package com.yc.batch;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import org.springframework.jdbc.core.RowMapper;
- import org.springframework.stereotype.Component;
- import com.yc.vo.TeacherInterviewdetail;
- import com.yc.vo.TeacherWorkdetail;
- import com.yc.vo.Workdetail;
- @Component("teacherInterviewMapper")
- public class TeacherInterviewMapper implements RowMapper {
- @Override
- public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
- TeacherInterviewdetail TId=new TeacherInterviewdetail();
- TId.setTeacherName(rs.getString("teacherName"));
- TId.setNum(rs.getInt("num"));
- return TId;
- }
- }
处理数据 teacherInterviewProcessor ,这个处理数据方法,一般都是在这里在这里进行一些数据的加工,比如有些数据没有读到,你也可以在这个方法和后面那个写入数据的类里面写,所以就导致了这个类里面你可以什么都不敢,直接把数据抛到后面去,让后面的写数据类来处理;我这里就是处理数据的这个类什么都没写,但是最好还是按它的规则来!
- package com.yc.batch;
- import org.hibernate.engine.transaction.jta.platform.internal.SynchronizationRegistryBasedSynchronizationStrategy;
- import org.springframework.batch.item.ItemProcessor;
- import org.springframework.stereotype.Component;
- import org.springframework.stereotype.Service;
- import com.yc.vo.TeacherInterviewdetail;
- import com.yc.vo.TeacherWorkdetail;
- import com.yc.vo.Workdetail;
- //业务层
- @Component("teacherInterviewProcessor")
- public class TeacherInterviewProcessor implements ItemProcessor<TeacherInterviewdetail, TeacherInterviewdetail> {
- @Override
- public TeacherInterviewdetail process(TeacherInterviewdetail teacherInterviewdetail) throws Exception {
- return teacherInterviewdetail;
- }
- }
写数据 teacherInterviewItemWriter 这个类里面主要是把数据写进一个文件里,同时我这个类里面还有一些数据处理
- package com.yc.batch;
- import java.io.InputStream;
- import java.text.NumberFormat;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Properties;
- import javax.annotation.Resource;
- import org.springframework.batch.item.ItemWriter;
- import org.springframework.stereotype.Component;
- import org.springframework.stereotype.Service;
- import com.yc.biz.ExamineeClassBiz;
- import com.yc.biz.WorkBiz;
- import com.yc.utils.CsvUtils;
- import com.yc.vo.TeacherInterviewdetail;
- import com.yc.vo.TeacherWorkdetail;
- import com.yc.vo.Workdetail;
- import net.sf.ehcache.util.PropertyUtil;
- //写
- @Component("teacherInterviewItemWriter")
- public class TeacherInterviewItemWriter implements ItemWriter<TeacherInterviewdetail>{
- @Override
- public void write(List<? extends TeacherInterviewdetail> teacherInterviewdetails) throws Exception {
- Properties props = new Properties();
- InputStream in= PropertyUtil.class.getClassLoader().getResourceAsStream("connectionConfig.properties");
- props.load(in);
- String time=props.getProperty("detail_time");
- CsvUtils cu=new CsvUtils();
- List<Object> works=new ArrayList<Object>();
- for(TeacherInterviewdetail t:teacherInterviewdetails){
- works.add(t);
- }
- String path=this.getClass().getResource("/").getPath();
- path=path.substring(0,path.lastIndexOf("/"));
- path=path.substring(0,path.lastIndexOf("/"));
- path=path.substring(0,path.lastIndexOf("/"));
- path=path.substring(0,path.lastIndexOf("/"));
- cu.writeCsv(path+"/csv/teacherInterview_"+time+".csv",works );
- }
- }
我这里有用到一个吧数据写进CSV文件的jar包
- <span style="white-space:pre;"> </span><dependency>
- <groupId>net.sourceforge.javacsv</groupId>
- <artifactId>javacsv</artifactId>
- <version>2.0</version>
- </dependency>
CsvUtils帮助类的写入CSV文件方法
- /**
- * 写入CSV文件
- * @throws IOException
- */
- public void writeCsv(String path,List<Object> t) throws IOException{
- String csvFilePath = path;
- String filepath=path.substring(0,path.lastIndexOf("/"));
- File f=new File(filepath);
- if(!f.exists()){
- f.mkdirs();
- }
- File file=new File(path);
- if(!file.exists()){
- file.createNewFile();
- }
- CsvWriter wr =new CsvWriter(csvFilePath,',',Charset.forName("GBK"));
- try {
- for(Object obj:t){
- String[] contents=obj.toString().split(",");
- wr.writeRecord(contents);
- }
- wr.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
就这样一个基本的batch流程就跑起来了,它通过从数据里读取一些数据,然后经过处理后,被存进服务器下的一个文件里面,之后像这种数据的读取就不需要去数据库里面
查询了,而是可以直接通过读取CSV文件来处理这个业务。一般使用这个的都会配一个定时器,让它们每隔一段时间跑一次,从而获得较新的数据
下面是定时器的配置
定时器的配置非常简单,我是使用注解方式来配置的
定时器任务类
- package com.yc.task.impl;
- import javax.transaction.Transactional;
- import org.springframework.batch.core.JobParametersInvalidException;
- import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
- import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
- import org.springframework.batch.core.repository.JobRestartException;
- import org.springframework.batch.item.ItemProcessor;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.scheduling.annotation.Scheduled;
- import org.springframework.stereotype.Component;
- import org.springframework.stereotype.Service;
- import com.yc.batch.ClassBatch;
- import com.yc.batch.MessageItemBatch;
- import com.yc.batch.TeacherInterviewBatch;
- import com.yc.batch.TearcherBatch;
- import com.yc.po.Work;
- import com.yc.task.WorkTask;
- import com.yc.vo.Workdetail;
- @Service
- public class WorkTaskImpl implements WorkTask{
- @Autowired
- private TeacherInterviewBatch teacherInterviewBatch;//教师访谈记录
- public void setTeacherInterviewBatch(TeacherInterviewBatch teacherInterviewBatch) {
- this.teacherInterviewBatch = teacherInterviewBatch;
- }
- @Scheduled(cron= "0 30 22 * * ?") //每天晚上十点30执行一次 这个注解会让框架会自动把这个方法看成任务启动方法
- @Override
- public void task() {
- try {
- teacherInterviewBatch.test();//教师访谈
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
定时器所真正要执行的方法
- package com.yc.batch;
- import javax.annotation.Resource;
- import org.apache.commons.jexl2.Main;
- import org.springframework.batch.core.Job;
- import org.springframework.batch.core.JobExecution;
- import org.springframework.batch.core.JobParameters;
- import org.springframework.batch.core.JobParametersBuilder;
- import org.springframework.batch.core.JobParametersInvalidException;
- import org.springframework.batch.core.launch.JobLauncher;
- import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
- import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
- import org.springframework.batch.core.repository.JobRestartException;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
- @Component
- public class TeacherInterviewBatch {
- private Job job;
- private JobLauncher launcher;
- @Resource(name="writerteacherInterview")
- public void setJob(Job job) {
- this.job = job;
- }
- @Autowired
- public void setLauncher(JobLauncher launcher) {
- this.launcher = launcher;
- }
- public void test() throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException{
- JobParameters jobParameters =
- new JobParametersBuilder()
- .addLong("time",System.currentTimeMillis()).toJobParameters();
- JobExecution result = launcher.run(job, jobParameters);
- }
- }
就这样batch就被定时器调度起来了,每天十点准时使用batch来操作数据
转自:https://blog.csdn.net/pttaoge/article/details/76684656
spring batch的使用和定时器Quart的使用的更多相关文章
- Spring Batch在大型企业中的最佳实践
在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...
- spring batch资料收集
spring batch官网 Spring Batch在大型企业中的最佳实践 一篇文章全面解析大数据批处理框架Spring Batch Spring Batch系列总括
- Spring Batch学习笔记三:JobRepository
此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch Job在运行时有很多元数据,这些元数据一般会被保存在内存或者数据库中,由于Spring Batch在默认配置是使用H ...
- Spring Batch学习笔记二
此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自 ...
- 初探Spring Batch
此系列博客皆为学习Spring Batch时的一些笔记: 为什么我们需要批处理? 我们不会总是想要立即得到需要的信息,批处理允许我们在请求处理之前就一个既定的流程开始搜集信息:比如说一个银行对账单,我 ...
- Spring Batch 中文参考文档 V3.0.6 - 1 Spring Batch介绍
1 Spring Batch介绍 企业领域中许多应用系统需要采用批处理的方式在特定环境中运行业务操作任务.这种业务作业包括自动化,大量信息的复杂操作,他们不需要人工干预,并能高效运行.这些典型作业包括 ...
- Spring Batch 批处理框架
<Spring Batch 批处理框架>基本信息作者: 刘相 出版社:电子工业出版社ISBN:9787121252419上架时间:2015-1-24出版日期:2015 年2月开本:16开页 ...
- [Spring Batch] 图解Spring Batch原理
找到一副以前学习的图,稻清楚的描述了Spring Batch运行原理:
- Spring Batch实践
Spring Batch在大型企业中的最佳实践 在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后 ...
随机推荐
- Leetcode 647.回文子串
回文子串 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "abc&qu ...
- PAT A+B格式
A + B格式(20) 时间限制 400毫秒 内存限制 65536 kB 代码长度限制 16000 B. 判断程序 标准 作者 陈,岳 计算a + b并以标准格式输出总和 - 即数字必须用逗号分隔成三 ...
- CSS查缺补漏篇
前面的话:关于CSS,之前我已经做过一些基础的知识点介绍.CSS主要是用来给页面设置样式的,一般说来,在一个网站中,CSS应该独立封装在一个单独的.css外部文件中.样式的设置总体来说是不难的,但是需 ...
- NOIP试题解析
NOIP试题解析 by QTY_YTQ noip2010关押罪犯(并查集) 题意是有n个罪犯关在两个监狱中,其中有m对罪犯有仇恨关系,如果有仇恨的罪犯关在一起会产生一定影响力的事件 ...
- [HNOI2008][bzoj1009] GT考试 [KMP+矩阵快速幂]
题面 传送门 思路 首先,如果$n$和$m$没有那么大的话,有一个非常显然的dp做法: 设$dp[i][j]$表示长度为i的字符串,最后j个可以匹配模板串前j位的情况数 那么显然,答案就是$\sum_ ...
- xor和路径(codevs 2412)
题目描述 Description 给定一个无向连通图,其节点编号为1到N,其边的权值为非负整数.试求出一条从1号节点到 N 号节点的路径,使得该路径上经过的边的权值的“XOR 和”最大.该路径可以重复 ...
- linux之awk手册
awk 手册 原文 Table of Contents 1. awk简介 2. awk命令格式和选项 2.1. awk的语法有两种形式 2.2. 命令选项 3. 模式和操作 3.1. 模式 3.2 ...
- 东野圭吾--嫌疑人X的献身读后感
经推荐,打算看日本大作家东野圭吾的<嫌疑人X的献身>.书很薄,八开大小的书两百多页,一下午的时间差不多就能读完.读了前面几章,代入感很强,压抑浓郁的气氛着实让人难受,所以打算先看一下电影, ...
- NOIP2015提高组T2 洛谷P2661 信息传递
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
- ckeditor与ckfinder的使用方法 .NET (转载)
原文发布时间为:2009-11-25 -- 来源于本人的百度文章 [由搬家工具导入] ckeditor与ckfinder的使用方法 .NET (转载) ckeditor 3.0.1学习笔记 一.ck ...