什么是SpringBatch:SpringBatch是一种轻量级的、完善的批处理框架
SpringBatch的应用场景:高效处理大量信息、定时处理大量数据、联机跑批、多机批处理
一:SpringBatch的基本流程体系:
其实按照通俗来说 就是三个部分:RPW, R指的是Read意思为读取文件,P指得Processor处理文件,W指的是Writer意思为写入指定的文件中。一个批处理就是一个Step。
其中ItemReader包括:DBLargeReader(数据量过大,分段时使用)、DBReader、FileJsonReader(JSON文件处理)、FileStructReader(读取格式,用的时候比较多)
我们在使用SpringBatch中,我们要知道一个清晰的逻辑就是:在使用不同的Reader,都要选择与Reader想配套的Process
那Processor包括:DBLargeProcessor、DBProcessor、FileJsonProcessor等
Writer包括:FileStructWriter(使用较多)、NoneWriter
二:不可忽略的问题:
我们在进行批处理的时候,我们需要进行监听!!!!很多时候,我们漏掉了这个环节,会导致一系列的错误,这个在之后的文档中,会具体分析
浅谈一下监听的选择:在我们这个业务体系中,主要用到的监听就是:KBMonitorListener、KBPartitionStepListener.
监听以及监听在项目的中的配置请移步:
listener监听器 - ThinkIng_Nick - 博客园 (cnblogs.com)https://www.cnblogs.com/wkk1993/p/4962281.html
三:如何处理单线程以及多线程批量处理
当数据量过大,一台服务器无法满足我们的需求时,这个时候,我们就需要引入多台服务器进行协同处理。即对现有的数据进行切片,引入PartitionStep,
这里我们就会遇到一个问题:当多机跑批进行任务分片时,可能会出现多机资源无法充分利用的问题:
(1)在性能方面,可能kill掉跑批慢的PartitionStep ,让跑的快的继续执行
(2)数据量方面;如果文件非常大,可以考虑把数据拆分给分布式文件存储管理系统,存放不同节点
在使用的时候,我们使用KBParition进行单机多线程,使用KBRemoteParition进行远程多线程处理
四:在使用SpringBatch我们经常会遇到问题以及解决办法
1.空指针错误:
在出现空指针错误时,大多数多是获取到的对象为空,所以只需要在获取对象时,建立一个非空判断,即可解决
2.当同时运行多个job,jobname以及JobParameters 相同时,控制台会报出: org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException: A job instance already exists and is complete for parameters={startDate=20130404, endDate=20130404}. If you want to run this job again, change the parameters:
这个错误说明当JobParameters 相同的任务只能成功运行一次 ,如果连续运行同一个job ,则会出现此异常 解决方法:在Parameters中添加:
<bean id ="runIdIncrementer" // 为数据库中主键id class ="org.springframework.batch.core.launch.support.RunIdIncrementer" />,或者改变jobParameters 中的参数,因为JobInstance=jobname+jobParameters //JobInstance为job是实例,Job每执行一次就会有一个JobInstance
3.spring batch中自增序列问题:
SpringBatch 中有很多以 seq 结尾的表,这些表的自增依赖MySQL 的内置函数 last_insert_id(),如果使用其他数据库(比如h2, TDSQL),但是使用MySQL的驱动,有可能报错: at org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer.getNextKey() 解决方法:利用覆盖整个类进行操作或者修改驱动,找到合适的驱动进行处理
五:如何搭建SpingBatch
1.在工程中引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
2.编写入口:
@SpringBootApplication
@EnableBatchProcessing
public class BatchJobMain {
public static void main(String[] args) {
SpringApplication.run(BatchJobMain.class, args);
}
}
也很简单,只是在Springboot的基础上添加注解@EnableBatchProcessing。
更多搭建内容请移步:批处理框架之SpringBatch简介_jackssybin的博客-CSDN博客_springbatchhttps://blog.csdn.net/jackssybin/article/details/124957443以上就是本人对SpingBatch一些简单的了解,后续在项目中使用到批量框架还会进行记录。