Java Spring批处理默认重试策略
我有以下批处理的Spring配置。我在生产批次中遇到了一个问题,当一个特定用例抛出一个不可跳过的异常时。当我在集成测试中复制用例时,批处理行为仍然很奇怪当my batch.commit-interval属性大于1时,将触发重试机制,回滚未提交的区块,并再次处理以前的所有记录。当批提交间隔设置为1时,一旦抛出不可跳过的异常,批处理就会失败 我尝试了批提交间隔和重试限制的各种值。导致该问题的特定异常是NullPointerException我的目标是使用NeverRetryPolicy更好地处理该异常,如果不是,则使用经典异常处理。我不想重试处理失败的项目,所以我甚至使用了NeverRetryPolicy。但似乎整个过程最终都是由批提交间隔驱动的(使用重试限制、可重试的异常类和NeverRetryPolicy似乎没有效果) 我已经阅读了StackOverflow的其他类似问题。谢谢你的帮助Java Spring批处理默认重试策略,java,spring-batch,Java,Spring Batch,我有以下批处理的Spring配置。我在生产批次中遇到了一个问题,当一个特定用例抛出一个不可跳过的异常时。当我在集成测试中复制用例时,批处理行为仍然很奇怪当my batch.commit-interval属性大于1时,将触发重试机制,回滚未提交的区块,并再次处理以前的所有记录。当批提交间隔设置为1时,一旦抛出不可跳过的异常,批处理就会失败 我尝试了批提交间隔和重试限制的各种值。导致该问题的特定异常是NullPointerException我的目标是使用NeverRetryPolicy更好地处理该异
<?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" />
读者和作者都是经典的。这是处理器的代码
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;
}
}
包ma.awb.ebk.bel.batch.retry;
导入ma.awb.ebk.bel.domain.CaracteristiquesCarte;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入org.springframework.batch.item.ItemProcessor;
公共类BDToFlatFileRetryProcessor实现ItemProcessor{
专用静态整数计数器=0;
私有静态最终记录器Logger=LoggerFactory.getLogger(BDToFlatFileRetryProcessor.class);
@凌驾
公共特征法(特征法)
抛出异常{
字符串见证=null;
计数器++;
System.out.println(“调试迭代N°”+计数器+“”+caracteristiques.getCodeProduit());
//测试仪为空
如果(计数器==4){
System.out.println(“PETTAGE”+计数器);
字符串测试=见证子字符串(2);
}
返回特征;
}
}
我看到的一个问题是,您得到的是空指针,这不应该发生。如果你修好了会怎么样?Rest看起来像是批处理的理想行为。你确定没有修复的NPE是一个很好的实践吗?@Luca Basso Ricci,我当然可以修复它。但这是一个完全理解默认重试行为的机会。此代码模拟生产代码,我特意创建了触发NPE的条件,以便完全理解处理代码中异常所需的默认重试行为。要点很简单,如果抛出任何异常,您必须告诉SpringBatch您想要什么操作?您可以说我不关心此异常,这意味着您需要将该异常添加到可跳过异常列表中。重试只是一个概念,如果Spring Batch Retry无法运行您的批处理,您所注意到的是完美的预期行为。感谢您的帮助:我非常感谢。我最终不得不处理这个异常。但我仍然需要找到一些问题的答案。作为默认重试行为的一部分,spring批处理重试不可跳过的异常的次数。重试行为以何种方式取决于批提交间隔?我们如何告诉SpringBatch我们不希望重试?为什么在我使用NeverRetryPolicy时,它似乎没有任何影响?…我将不得不对这些进行更多测试,直到满意为止。