详解spring batch的使用和定时器Quart的使用
发布时间 - 2026-01-11 02:40:14 点击率:次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包
<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>
<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>
<!--一个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包
<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;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# batch
# 定时器
# quartz
# 使用
# Java中批处理框架spring batch详细介绍
# 详解SpringBoot和SpringBatch 使用
# 基于Spring Batch向Elasticsearch批量导入数据示例
# 详解Spring batch 入门学习教程(附源码)
# 浅谈Spring Batch在大型企业中的最佳实践
# Spring Batch入门教程篇
# Spring Batch读取txt文件并写入数据库的方法教程
# Spring batch批处理框架
# spring batch 读取多个文件数据导入数据库示例
# 详解批处理框架之Spring Batch
# 在这里
# 写进
# 的是
# 都是
# 是一个
# 我是
# 在这个
# 你可以
# 多个
# 有可能
# 就有
# 要去
# 批处理
# 这样一个
# 会让
# 可以直接
# 数据处理
# 不需
# 还有一些
# 你也可以
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
深圳网站制作的公司有哪些,dido官方网站?
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
java获取注册ip实例
Laravel中的Facade(门面)到底是什么原理
Laravel怎么实现验证码(Captcha)功能
如何快速生成高效建站系统源代码?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
用yum安装MySQLdb模块的步骤方法
Laravel如何创建自定义中间件?(Middleware代码示例)
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
如何在宝塔面板中修改默认建站目录?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
js实现点击每个li节点,都弹出其文本值及修改
创业网站制作流程,创业网站可靠吗?
Android自定义listview布局实现上拉加载下拉刷新功能
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
javascript读取文本节点方法小结
Laravel如何集成Inertia.js与Vue/React?(安装配置)
C#如何调用原生C++ COM对象详解
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
独立制作一个网站多少钱,建立网站需要花多少钱?
如何快速生成凡客建站的专业级图册?
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
phpredis提高消息队列的实时性方法(推荐)
bootstrap日历插件datetimepicker使用方法
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
中国移动官方网站首页入口 中国移动官网网页登录
Linux系统命令中screen命令详解
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
如何快速启动建站代理加盟业务?
Laravel如何实现用户密码重置功能?(完整流程代码)
如何在云主机快速搭建网站站点?
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
郑州企业网站制作公司,郑州招聘网站有哪些?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何快速搭建自助建站会员专属系统?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
Android使用GridView实现日历的简单功能
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
微信小程序 require机制详解及实例代码
做企业网站制作流程,企业网站制作基本流程有哪些?
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
iOS UIView常见属性方法小结

