Spring Batch中如何将ExponentialBackOffPolicy与现有SimpleRetryPolicy结合使用
问题根因
- 最初配置报错是因为
ExceptionClassifierRetryPolicy的policyMap仅允许存储RetryPolicy接口的实现类,ExponentialBackOffPolicy属于退避策略接口的实现,不能直接放到policyMap的entry节点下,所以会触发单bean绑定错误。 - 后续自定义
RetryTemplate后不生效,是因为你仅完成了RetryTemplate的实例定义,没有将其和Spring Batch的Step执行逻辑关联,原有Step的重试逻辑还是走的旧配置,没有用到你新增的退避策略。
解决方案
方案一:直接使用Spring Batch自带的重试/退避配置(推荐,无需自定义RetryTemplate)
直接在Chunk节点下声明可重试异常和退避策略即可满足需求,配置如下:
<batch:step id="baseStep" abstract="true"> <batch:tasklet> <batch:chunk reader="cvsFileItemReader" processor="itemProcessorAsync" writer="itemWriterAsync" commit-interval="100" retry-limit="3"> <!-- 配置仅空指针异常触发重试 --> <batch:retryable-exception-classes> <batch:include class="java.lang.NullPointerException"/> <!-- 如需排除其他异常可新增batch:exclude节点 --> </batch:retryable-exception-classes> <!-- 配置指数退避策略 --> <batch:back-off-policy> <bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy"> <property name="initialInterval" value="1000" /> <property name="multiplier" value="1.5" /> </bean> </batch:back-off-policy> </batch:chunk> </batch:tasklet> </batch:step>
该配置会自动实现:仅NullPointerException触发最多3次重试,重试间隔按1s、1.5s、2.25s的指数规则增长,完全匹配你的需求。
方案二:绑定自定义的RetryTemplate到Step
如果你确实需要使用自定义RetryTemplate处理更复杂的重试逻辑,需要将RetryTemplate注入到Step的重试处理器中,XML配置示例如下:
- 保留你最后定义的
RetryTemplate配置:
<bean id="retryTemplate" class="org.springframework.retry.support.RetryTemplate"> <property name="retryPolicy"> <bean class="org.springframework.retry.policy.ExceptionClassifierRetryPolicy"> <property name="policyMap"> <map> <entry key="java.lang.NullPointerException"> <bean class="org.springframework.retry.policy.SimpleRetryPolicy"> <property name="maxAttempts" value="3" /> </bean> </entry> </map> </property> </bean> </property> <property name="backOffPolicy"> <bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy"> <property name="initialInterval" value="1000" /> <property name="multiplier" value="6" /> </bean> </property> </bean>
- 配置Step使用该RetryTemplate:
<batch:step id="baseStep" abstract="true"> <batch:tasklet> <batch:chunk reader="cvsFileItemReader" processor="itemProcessorAsync" writer="itemWriterAsync" commit-interval="100"> </batch:chunk> <!-- 注入自定义重试处理器,绑定RetryTemplate --> <batch:retry-handler> <bean class="org.springframework.batch.core.step.item.SimpleRetryExceptionHandler"> <constructor-arg name="retryOperations" ref="retryTemplate"/> <constructor-arg name="retryableExceptions"> <map> <entry key="java.lang.NullPointerException" value="true"/> </map> </constructor-arg> </bean> </batch:retry-handler> </batch:tasklet> </batch:step>
内容的提问来源于stack exchange,提问作者One Developer
相关产品推荐
相关产品推荐

