簡體   English   中英

Spring Batch默認重試策略

[英]Spring batch default retry policy

我有以下Spring配置批處理。 當特定用例引發不可跳過的異常時,我在生產批處理中遇到了問題。 當我在集成測試中重現用例時,批處理行為仍然很奇怪。 當我的batch.commit-interval屬性大於1時,將觸發重試機制,回退未提交的塊,並再次處理所有先前的記錄。 當batch-commit-interval設置為1時,一旦拋出不可跳過的異常,批處理就會失敗

我為batch-commit-interval以及retry-limit嘗試了各種值。 導致該問題的特定異常是NullPointerException。 我的目標是使用NeverRetryPolicy優先處理該異常,如果沒有,則使用經典異常處理 我不希望重試失敗的項目,因此我什至使用了NeverRetryPolicy。 但是似乎整個事情最終都是由批處理提交間隔驅動的(使用重試限制,可重試的異常類和NeverRetryPolicy似乎無效)

我已經從StackOverflow閱讀了其他類似的問題。 感謝您的幫助。

<?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;
}

}

我看到的問題之一是您正在獲取null指針,這永遠不會發生。 如果您修復它會怎樣? 休息看起來像批處理所需的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM