Spring Batch 如何健壮可重启可追溯 SKIP/RETRY/RESTART策略的应用

前提:你已经有了一定的Spring基础

你已经可以跑动一个简单的Spring batch 的实例

参考:http://www.cnblogs.com/gulvzhe/archive/2011/10/25/2224249.html

http://www.cnblogs.com/cdutedu/p/3789396.html

先盗几个图

JobLauncher 指定一个 JobRepository

JobRepository包含了一些传入JOB的参数,主要有六个表去存储

每个JOB可以对应多个Step

		 ...<batch:step id="aStep" next="bStep">
			<batch:tasklet>
				<batch:chunk reader="aReader" writer="aWriter" processor="aProcessor" commit-interval="1000" />
			</batch:tasklet>
		</batch:step>...

tesklet里面的工作块为chunk,每个chunk执行完commit-interval,即提交一次,可以同时开多个chunk

每个STEP 这样执行

(以下一段摘抄)

从DB或是文件中取出数据的时候,read()操作每次只读取一条记录,之后将读取的这条数据传递给processor(item)处理,框架将重复做这两步操作,直到读取记录的件数达到batch配置信息中”commin-interval”设定值的时候,就会调用一次write操作。然后再重复上图的处理,直到处理完所有的数据。当这个Step的工作完成以后,或是跳到其他Step,或是结束处理。

那么问题来了?读取数据到处理的时候发生了异常如何处理?会不会导致整个批处理中断呢?

有异常没有捕获,到最上层也没有的话整个进程会挂掉,导致整个批处理中断。

显然,为了不影响后面的处理,要么捕获异常,打出日志,跳过。要么,重试(在IO超时或者表锁定的情况下是很有效的-瞬态情况)。

即使有中断,我们也需要重启JOB

以上几种正好对应Spring-Batch中的 SKIP\RETYR\RESTART

一、SKIP

<job id="importProductsJob">
<step id="importProductsStep">
<tasklet>
<chunk reader="reader" writer="writer" commit-interval="100"
skip-limit="10">
<skippable-exception-classes>
<include class="org.springframework.batch
? .item.file.FlatFileParseException" />
</skippable-exception-classes>
</chunk>
</tasklet>
</step>
</job>

skippable-exception-classes 里面配需要SKIP的异常类型

skip-limit 最多可以容错次数,超过这个数,该STEP中断

也可以添加listener去打日志

<bean id="skipListener" class="com.manning
? .sbia.ch08.skip.DatabaseSkipListener">
<constructor-arg ref="dataSource" />
</bean>
<job id="importProductsJob"
xmlns="http://www.springframework.org/schema/batch">
<step id="importProductsStep">
<tasklet>
<chunk reader="reader" writer="writer"
commit-interval="100" skip-limit="10">
<skippable-exception-classes>
<include class="org.springframework.batch.item.file
? .FlatFileParseException" />
</skippable-exception-classes>
</chunk>
<listeners>
<listener ref="skipListener" />
</listeners>
</tasklet>
</step>
</job>

二、Retrying on error

主要针对于IO操作的、并发等,瞬态的错误

类似于SKIP的配置

<job id="importProducsJob">
<step id="importProductsStep">
<tasklet>
<chunk reader="reader" writer="writer" commit-interval="100"
retry-limit="3">
<retryable-exception-classes>
<include class="org.springframework.dao
?.OptimisticLockingFailureException" />
</retryable-exception-classes>
</chunk>
</tasklet>
</step>
</job>

如果你不想重试次数达到后,由于这些错误导致STEP的中断退出,可以混合RETRY和SKIP两者。

<job id="job">
<step id="step">
<tasklet>
<chunk reader="reader" writer="writer" commit-interval="100"
retry-limit="3" skip-limit="10">
<retryable-exception-classes>
<include class="org.springframework.dao
? .DeadlockLoserDataAccessException" />
</retryable-exception-classes>
<skippable-exception-classes>
<include class="org.springframework.dao
? .DeadlockLoserDataAccessException" />
</skippable-exception-classes>
</chunk>
</tasklet>
</step>
</job>

你也可以通过自定义的策略来控制重试

<job id="retryPolicyJob"
xmlns="http://www.springframework.org/schema/batch">
<step id="retryPolicyStep">
<tasklet>
<chunk reader="reader" writer="writer" commit-interval="100"
retry-policy="retryPolicy" />
</tasklet>
</step>
</job>
<bean id="retryPolicy" class="org.springframework
?.batch.retry.policy.ExceptionClassifierRetryPolicy">
<property name="policyMap">
<map>
<entry key="org.springframework.dao.ConcurrencyFailureException">
<bean class="org.springframework.batch.retry
?.policy.SimpleRetryPolicy">
<property name="maxAttempts" value="3" />
</bean>
</entry>
<entry key="org.springframework.dao
? .DeadlockLoserDataAccessException">
<bean class="org.springframework.batch.retry
? .policy.SimpleRetryPolicy">
<property name="maxAttempts" value="5" />
</bean>
</entry>
</map>
</property>
</bean>

你也可以添加Listener

配置方法类似同SKIP,继承RetryListenerSupport,配置在retry-listeners

你还可以通过RetryTemplate来重试。RetryTemplate配置属性retryPolicy

三、重启

重启的重点是能够保存之前的job repository,自带的reader,都可以,自己写的Reader需要继承接口

Spring batch 默认是会重启的

allow-start-if-complete配置在tasklet上,决定了tasklet会不会在JOB重试的时候,重试该STEP(可能是下个STEP发生了异常)。

start-limit用来控制STEP级别的重试次数,重试次数结束后,JOB中断退出。

处理在STEP中的状态,已经处理了很多ITEM,失败了?

middle of a chunk-oriented step,item级别的重启。首先是reader的重启。

如果你需要你自己写的ITEM的reader,也可以实现重启的话,需要实现ItemStram的接口,将对于item 计数的值,保存到executionContext,重启的时候去读取。

时间: 2024-12-28 17:40:59

Spring Batch 如何健壮可重启可追溯 SKIP/RETRY/RESTART策略的应用的相关文章

【转】大数据批处理框架 Spring Batch全面解析

如今微服务架构讨论的如火如荼.但在企业架构里除了大量的OLTP交易外,还存在海量的批处理交易.在诸如银行的金融机构中,每天有3-4万笔的批处理作业需要处理.针对OLTP,业界有大量的开源框架.优秀的架构设计给予支撑:但批处理领域的框架确凤毛麟角.是时候和我们一起来了解下批处理的世界哪些优秀的框架和设计了,今天我将以Spring Batch为例,和大家一起探秘批处理的世界.初识批处理典型场景探秘领域模型及关键架构实现作业健壮性与扩展性批处理框架的不足与增强批处理典型业务场景对账是典型的批处理业务处

Spring Batch实践

Spring Batch在大型企业中的最佳实践 在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是"批处理". 批处理应用通常有以下特点: 数据量大,从数万到数百万甚至上亿不等: 整个过程全部自动化,并预留一定接口进行自定义配置: 这样的应用通常是周期性运行,比如按日.周.月运行: 对数据处理的准确性要求高,并且需要容错机制.回滚机制.完善的日志监控

Spring Batch 中文参考文档 V3.0.6

1 Spring Batch介绍 企业领域中许多应用系统需要采用批处理的方式在特定环境中运行业务操作任务.这种业务作业包括自动化,大量信息的复杂操作,他们不需要人工干预,并能高效运行.这些典型作业包括:基于时间的事件处理(例如:月底结算,通知或信函):重复的.数据量大的.业务逻辑规则错综复杂的定期任务(例如:保险盈利决策和利率调整):来自内外部不同应用系统的信息集成任务,这些信息需要进行格式化.校验,并通过事务的方式处理成为系统可用的记录.批处理程序就是用来处理这种数以亿计的企业日常事务. Sp

图书简介:Spring Batch批处理框架

大数据时代批处理利器,国内首度原创解析Spring Batch框架. 内容简介: <Spring Batch 批处理框架>全面.系统地介绍了批处理框架Spring Batch,通过详尽的实战示例向读者展示了Spring Batch框架对大数据批处理的基本开发能力,并对框架的架构设计.源码做了特定的剖析:在帮助读者掌握Spring Batch框架基本功能.高级功能的同时,深入剖析了Spring Batch框架的设计原理,帮助读者可以游刃有余地掌握Spring Batch框架. <Sprin

Spring Batch在大型企业中的最佳实践

在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是"批处理". 批处理应用通常有以下特点: 数据量大,从数万到数百万甚至上亿不等: 整个过程全部自动化,并预留一定接口进行自定义配置: 这样的应用通常是周期性运行,比如按日.周.月运行: 对数据处理的准确性要求高,并且需要容错机制.回滚机制.完善的日志监控等. 什么是Spring batch Sprin

Spring Batch 专题

如今微服务架构讨论的如火如荼.但在企业架构里除了大量的OLTP交易外,还存在海量的批处理交易.在诸如银行的金融机构中,每天有3-4万笔的批处理作业需要处理.针对OLTP,业界有大量的开源框架.优秀的架构设计给予支撑:但批处理领域的框架确凤毛麟角.是时候和我们一起来了解下批处理的世界哪些优秀的框架和设计了,今天我将以Spring Batch为例,和大家一起探秘批处理的世界. 初识批处理典型场景 探秘领域模型及关键架构 实现作业健壮性与扩展性 批处理框架的不足与增强 批处理典型业务场景 对账是典型的

spring batch(二):核心部分(1):配置Spring batch

spring batch(二):核心部分(1):配置Spring batch 博客分类: Spring 经验 java chapter 3.Batch configuration 1.spring batch 的命名空间 spring xml中指定batch的前缀作为命名空间. 示例: Xml代码   <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sprin

Spring Batch 在大型企业中的最佳实践

在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是"批处理".批处理应用通常有以下特点: 数据量大,从数万到数百万甚至上亿不等:整个过程全部自动化,并预留一定接口进行自定义配置:这样的应用通常是周期性运行,比如按日.周.月运行:对数据处理的准确性要求高,并且需要容错机制.回滚机制.完善的日志监控等.什么是Spring batch Spring bat

spring batch批量处理框架

spring batch精选,一文吃透spring batch批量处理框架 前言碎语 批处理是企业级业务系统不可或缺的一部分,spring batch是一个轻量级的综合性批处理框架,可用于开发企业信息系统中那些至关重要的数据批量处理业务.SpringBatch基于POJO和Spring框架,相当容易上手使用,让开发者很容易地访问和利用企业级服务.spring batch具有高可扩展性的框架,简单的批处理,复杂的大数据批处理作业都可以通过SpringBatch框架来实现. spring batch