[英]Spring batch default retry policy
I have the following Spring configuration for a batch. 我有以下Spring配置批处理。 I have encountered an issue with a production batch, when a particular use case throws a non skippable exception.
当特定用例引发不可跳过的异常时,我在生产批处理中遇到了问题。 As I reproduced the use case in an integration tests the batch behaviour was still weird.
当我在集成测试中重现用例时,批处理行为仍然很奇怪。 When my batch.commit-interval property is greater than 1, the retry mechanism is triggered, the uncommitted chunk is rolled back and all the previous records are processed again.
当我的batch.commit-interval属性大于1时,将触发重试机制,回退未提交的块,并再次处理所有先前的记录。 when the batch-commit-interval is set to 1, the batch fails as soon as the non skippable exception is thrown .
当batch-commit-interval设置为1时,一旦抛出不可跳过的异常,批处理就会失败 。
I tried various values for the batch-commit-interval as well as for retry-limit. 我为batch-commit-interval以及retry-limit尝试了各种值。 The particular exception that is causing the issue is a NullPointerException.
导致该问题的特定异常是NullPointerException。 My goal is to handle that exception preferabbly with a NeverRetryPolicy, if not, with classic exception handling .
我的目标是使用NeverRetryPolicy优先处理该异常,如果没有,则使用经典异常处理 。 I don't want failed items processing to be retried, so I have even used the NeverRetryPolicy.
我不希望重试失败的项目,因此我什至使用了NeverRetryPolicy。 But it seems as though the whole thing was ultimately driven by the batch-commit-interval (using a retry-limit, retryable exception classes and the NeverRetryPolicy, seems to be without effect)
但是似乎整个事情最终都是由批处理提交间隔驱动的(使用重试限制,可重试的异常类和NeverRetryPolicy似乎无效)
I have read the other similar issues from StackOverflow. 我已经从StackOverflow阅读了其他类似的问题。 Thanks for helping.
感谢您的帮助。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:batch="http://www.springframework.org/schema/batch"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch.xsd">
<!--================ JOB & STEPS ================ -->
<batch:job id="BEL-batch-Retry-Tests">
<batch:step id="mainRetryTests" >
<batch:tasklet>
<batch:chunk reader="jpaReaderRetryTests" processor="bdToFlatFileProcessorRetryTests" writer="flatWriterRetryTests" commit-interval="${batch.commit-interval}" skip-limit="${batch.skip-limit}">
<batch:streams>
<batch:stream ref="flatWriterRetryTests" />
</batch:streams>
<batch:skippable-exception-classes>
<batch:include
class="org.springframework.batch.item.file.FlatFileParseException" />
<batch:include class="ma.awb.ebk.bel.batch.EntiteBatchInvalideException" />
</batch:skippable-exception-classes>
</batch:chunk>
<batch:listeners>
<batch:listener ref="stepListener"/>
<batch:listener ref="skipListener"/>
</batch:listeners>
</batch:tasklet>
<batch:listeners>
<batch:listener ref="stepListener"/>
<batch:listener ref="skipListener"/>
</batch:listeners>
</batch:step>
<batch:listeners>
<batch:listener ref="jobListener"/>
</batch:listeners>
</batch:job>
<!--================ READERS & WRITERS ================-->
<bean id="jpaReaderRetryTests" class="org.springframework.batch.item.database.JpaPagingItemReader">
<property name="entityManagerFactory" ref="entityManagerFactoryBel"/>
<property name="queryString" value="select c from CaracteristiquesCarte c"/>
<property name="pageSize" value="100"/>
</bean>
<bean id="flatWriterRetryTests" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
<property name="resource" value="file:${retry-tests.outputfile.basename}-#{jobParameters['runDate']}${retry-tests.outputfile.ext}" />
<property name="lineAggregator">
<bean
class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
<property name="delimiter" value="${batch.file.writer.delimiter}" />
<property name="fieldExtractor">
<bean
class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
<property name="names" value="codeProduit,nomCarte,codeAAfficher,rechargeable" />
</bean>
</property>
</bean>
</property>
</bean>
<bean id="bdToFlatFileProcessorRetryTests" class="ma.awb.ebk.bel.batch.retry.BDToFlatFileRetryProcessor" />
the reader and writer are classic. 读者和作家都是经典。 Here is the Processor's code
这是处理器的代码
package ma.awb.ebk.bel.batch.retry;
import ma.awb.ebk.bel.domain.CaracteristiquesCarte;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ItemProcessor;
public class BDToFlatFileRetryProcessor implements ItemProcessor<CaracteristiquesCarte, CaracteristiquesCarte> {
private static int counter = 0;
private static final Logger LOGGER = LoggerFactory.getLogger (BDToFlatFileRetryProcessor.class);
@Override
public CaracteristiquesCarte process(CaracteristiquesCarte caracteristiques)
throws Exception {
String witness = null;
counter++;
System.out.println("DEBUGGING iteration N° " + counter+" "+caracteristiques.getCodeProduit());
// Tester le cas d'un renvoie de null
if (counter == 4) {
System.out.println("PETTAGE " + counter);
String test = witness.substring(2);
}
return caracteristiques;
}
}
One of the problem I see is you are getting null pointer, which should never occur. 我看到的问题之一是您正在获取null指针,这永远不会发生。 What happens if you fix it?
如果您修复它会怎样? Rest looks like desired behaviour of batch processing.
休息看起来像批处理所需的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.