如何为job.xml文件中的块配置Spring Batch RetryPolicy

如何为job.xml文件中的块配置Spring Batch RetryPolicy,spring,spring-batch,restart,Spring,Spring Batch,Restart,我的配置与下面相同。但是如果要获取异常(请参见下文),请提供帮助。 这样做的目的是在出现故障时实现重启步骤 ======================================== retryPolicyJob.xml <batch:job id="retryPolicyJob" job-repository="jobRepository"> <batch:step id="retryPolicyStep"> <batch:taskl

我的配置与下面相同。但是如果要获取异常(请参见下文),请提供帮助。 这样做的目的是在出现故障时实现重启步骤

======================================== retryPolicyJob.xml

<batch:job id="retryPolicyJob" job-repository="jobRepository">
    <batch:step id="retryPolicyStep">
        <batch:tasklet>
            <batch:chunk reader="ConnectionRetryReader" writer="CustomItemWriter" commit-interval="100"
                retry-policy="retryPolicy" />
        </batch:tasklet>
    </batch:step>
</batch:job>

<bean id="ConnectionRetryReader" class="spring.batch.examples.retry.ConnectionRetryReader"/>
<bean id="CustomItemWriter" class="spring.batch.examples.retry.CustomItemWriter"/>

<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="2" />
                </bean>
            </entry>
            <entry key="org.springframework.dao.DeadlockLoserDataAccessException">
                <bean class="org.springframework.batch.retry.policy.SimpleRetryPolicy">
                    <property name="maxAttempts" value="3" />
                </bean>
            </entry>
        </map>
    </property>
</bean>

============================================= 读卡器类代码:

public class ConnectionRetryReader<T> implements ItemReader<T>, ItemStream {

    private int retryCount = 0;
    private T t;
    int currentIndex = 0;
    private static final String CURRENT_INDEX = "current.index";

    public T read() throws Exception, UnexpectedInputException, ParseException,
            NonTransientResourceException, ConnectionFailureException,
            ResourceNotAvailableException {
        retryCount++;
        System.out.println("In Retry " + retryCount);
        if (retryCount == 2) {
            System.out.println("throwing ConcurrencyFailureException");
            throw new org.springframework.dao.ConcurrencyFailureException(
                    "ConcurrencyFailureException thrown", new Exception());
        }
        System.out.println("throwing DeadlockLoserDataAccessException");
        throw new org.springframework.dao.DeadlockLoserDataAccessException(
                "DeadlockLoserDataAccessException thrown", new Exception());
    }

    public void open(ExecutionContext executionContext)
            throws ItemStreamException {
        if (executionContext.containsKey(CURRENT_INDEX)) {
            currentIndex = new Long(executionContext.getLong(CURRENT_INDEX))
                    .intValue();
        } else {
            currentIndex = 0;
        }
    }

    public void update(ExecutionContext executionContext)
            throws ItemStreamException {
        executionContext.putLong(CURRENT_INDEX,
                new Long(currentIndex).longValue());

    }

    public void close() throws ItemStreamException {
        // TODO Auto-generated method stub

    }

}
公共类ConnectionRetryReader实现ItemReader、ItemStream{
private int retryCount=0;
私人T;
int currentIndex=0;
私有静态最终字符串CURRENT\u INDEX=“CURRENT.INDEX”;
public T read()引发异常、UnexpectedInputException、ParseException、,
非TransientResourceException、ConnectionFailureException、,
ResourceNotAvailableException{
retryCount++;
System.out.println(“In Retry”+retryCount);
如果(retryCount==2){
System.out.println(“抛出并发失败异常”);
抛出新的org.springframework.dao.ConcurrencyFailureException(
“ConcurrencyFailureException抛出”,新异常());
}
System.out.println(“抛出死锁关闭DataAccessException”);
抛出新的org.springframework.dao.deadlocklesserDataAccessException(
“DeadlockLoserDataAccessException抛出”,新异常());
}
公开作废打开(ExecutionContext ExecutionContext)
抛出项流异常{
if(executionContext.containsKey(当前索引)){
currentIndex=new Long(executionContext.getLong(当前索引))
.intValue();
}否则{
currentIndex=0;
}
}
公共无效更新(ExecutionContext ExecutionContext)
抛出项流异常{
executionContext.putLong(当前索引,
新的Long(currentIndex.longValue());
}
public void close()引发ItemStreamException{
//TODO自动生成的方法存根
}
}
==================================================== 异常消息:

17:22:40,140 INFO main SimpleJobLauncher:179 - No TaskExecutor has been set, defaulting to synchronous executor. 17:22:40,546 INFO main SimpleJobLauncher:118 - Job: [FlowJob: [name=retryPolicyJob]] launched with the following parameters: [{}] 17:22:40,577 INFO main SimpleStepHandler:133 - Executing step: [retryPolicyStep] In Retry 1 throwing DeadlockLoserDataAccessException 17:22:40,640 ERROR main AbstractStep:212 - Encountered an error executing the step org.springframework.batch.core.step.skip.NonSkippableReadException: Non-skippable exception during read at org.springframework.batch.core.step.item.FaultTolerantChunkProvider.read(FaultTolerantChunkProvider.java:104) at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:108) at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:367) at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:214) at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143) at org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:103) at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:68) at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:386) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130) at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:264) at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:76) at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:367) at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:214) at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143) at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:250) at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195) at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:135) at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:61) at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60) at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:144) at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:124) at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135) at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:281) at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:120) at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:48) at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:114) at org.springframework.batch.core.launch.support.CommandLineJobRunner.start(CommandLineJobRunner.java:349) at org.springframework.batch.core.launch.support.CommandLineJobRunner.main(CommandLineJobRunner.java:574) at spring.batch.examples.retry.RetryTestCommandLine.main(RetryTestCommandLine.java:9) Caused by: org.springframework.dao.DeadlockLoserDataAccessException: DeadlockLoserDataAccessException thrown; nested exception is java.lang.Exception at spring.batch.examples.retry.ConnectionRetryReader.read(ConnectionRetryReader.java:30) at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:90) at org.springframework.batch.core.step.item.FaultTolerantChunkProvider.read(FaultTolerantChunkProvider.java:87) ... 28 more Caused by: java.lang.Exception at spring.batch.examples.retry.ConnectionRetryReader.read(ConnectionRetryReader.java:31) ... 30 more 17:22:40,655 INFO main SimpleJobLauncher:121 - Job: [FlowJob: [name=retryPolicyJob]] completed with the following parameters: [{}] and the following status: [FAILED] 17:22:40140信息主SimpleZoblancher:179-未设置TaskExecutor,默认为synchronous executor。 17:22:40546信息主SimpleJobLauncher:118-作业:[FlowJob:[name=retryPolicyJob]]使用以下参数启动:[{}] 17:22:40577信息主SimpleSphandler:133-执行步骤:[retryPolicyStep] 在重试1中 正在引发DeadlockLoserDataAccessException 17:22:40640错误main AbstractStep:212-执行该步骤时遇到错误 org.springframework.batch.core.step.skip.NonSkippableReadException:读取期间不可跳过的异常 位于org.springframework.batch.core.step.item.FaultTolerantChunkProvider.read(FaultTolerantChunkProvider.java:104) 位于org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInitation(SimpleChunkProvider.java:108) 位于org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:367) 位于org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:214) 位于org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143) 位于org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:103) 位于org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:68) 位于org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:386) 位于org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130) 位于org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:264) 位于org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInitation(StepContextRepeatCallback.java:76) 位于org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:367) 位于org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:214) 位于org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143) 位于org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:250) 位于org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195) 位于org.springframework.batch.core.job.simplestphandler.handleStep(simplestphandler.java:135) 位于org.springframework.batch.core.job.flow.JobFlowExecutor.ExecuteTEP(JobFlowExecutor.java:61) 位于org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60) 位于org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:144) 位于org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:124) 位于org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135) 位于org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:281) 位于org.springframework.batch.core.launch.support.simplejoblancher$1.run(simplejoblancher.java:120) 位于org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:48) 位于org.springframework.batch.core.launch.support.simplejoblancher.run(simplejoblancher.java:114) 位于org.springframework.batch.core.launch.support.CommandLineJobRunner.start(CommandLineJobRunner.java:349) 位于org.springframework.batch.core.launch.support.CommandLineJobRunner.main(CommandLineJobRunner.java:574) 在spring.batch.examples.retry.RetryTestCommandLine.main(RetryTestCommandLine.java:9)中 原因:org.springframework.dao.deadlocklesserDataAccessException:引发了deadlocklesserDataAccessException;嵌套的异常是java.lang.Excep