BATCH-1396: added step scope to skip policy in chunk parser

This commit is contained in:
Dave Syer
2011-03-20 09:32:36 +00:00
parent 63eee035d4
commit eb79b4c2fb
4 changed files with 26 additions and 8 deletions

View File

@@ -11,7 +11,7 @@
<step id="playerload" next="gameLoad">
<tasklet>
<chunk reader="playerFileItemReader" writer="playerWriter"
commit-interval="#{jobParameters['commit.interval']}" />
commit-interval="#{jobParameters['commit.interval']}"/>
</tasklet>
</step>
<step id="gameLoad" next="playerSummarization">

View File

@@ -9,7 +9,7 @@
<step id="playerload" next="gameLoad">
<tasklet>
<chunk reader="playerFileItemReader" writer="playerWriter" commit-interval="${job.commit.interval}"
skip-limit="100000">
skip-limit="#{jobParameters['skip.limit']}">
<skippable-exception-classes>
<include class="org.springframework.dao.DataAccessException" />
</skippable-exception-classes>

View File

@@ -82,13 +82,15 @@ public class FootballJobSkipIntegrationTests {
catch (Exception e) {
// Ignore (wrong platform)
}
JobExecution execution = jobLauncher.run(job, new JobParametersBuilder().addLong("run.id", 1L)
JobExecution execution = jobLauncher.run(job, new JobParametersBuilder().addLong("skip.limit", 0L)
.toJobParameters());
assertEquals(BatchStatus.COMPLETED, execution.getStatus());
for (StepExecution stepExecution : execution.getStepExecutions()) {
logger.info("Processed: " + stepExecution);
}
execution = jobLauncher.run(job, new JobParametersBuilder().addLong("run.id", 2L).toJobParameters());
// They all skip on the second execution because of a primary key violation
execution = jobLauncher.run(job, new JobParametersBuilder().addLong("skip.limit", 100000L)
.toJobParameters());
assertEquals(BatchStatus.COMPLETED, execution.getStatus());
for (StepExecution stepExecution : execution.getStepExecutions()) {
logger.info("Processed: " + stepExecution);

View File

@@ -18,6 +18,7 @@ package org.springframework.batch.core.configuration.xml;
import java.util.List;
import org.springframework.batch.core.listener.StepListenerMetaData;
import org.springframework.batch.core.step.skip.LimitCheckingItemSkipPolicy;
import org.springframework.batch.repeat.policy.SimpleCompletionPolicy;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
@@ -118,8 +119,26 @@ public class ChunkElementParser {
}
String skipLimit = element.getAttribute("skip-limit");
boolean hasSkipPolicy = false;
if (StringUtils.hasText(skipLimit)) {
propertyValues.addPropertyValue("skipLimit", skipLimit);
if (skipLimit.startsWith("#")) {
// It's a late binding expression, so we need step scope...
BeanDefinitionBuilder skipPolicy = BeanDefinitionBuilder
.genericBeanDefinition(LimitCheckingItemSkipPolicy.class);
skipPolicy.setScope("step");
handleExceptionElement(element, parserContext, skipPolicy.getBeanDefinition().getPropertyValues(),
"skippable-exception-classes", "skippableExceptionMap");
skipPolicy.addPropertyValue("skipLimit", skipLimit);
propertyValues.addPropertyValue("skipPolicy", skipPolicy.getBeanDefinition());
hasSkipPolicy = true;
}
else {
propertyValues.addPropertyValue("skipLimit", skipLimit);
}
}
if (!hasSkipPolicy) {
handleExceptionElement(element, parserContext, propertyValues, "skippable-exception-classes",
"skippableExceptionClasses");
}
handleItemHandler("skip-policy", "skipPolicy", null, false, element, parserContext, propertyValues,
@@ -148,9 +167,6 @@ public class ChunkElementParser {
propertyValues.addPropertyValue("processorTransactional", isProcessorTransactional);
}
handleExceptionElement(element, parserContext, propertyValues, "skippable-exception-classes",
"skippableExceptionClasses");
handleExceptionElement(element, parserContext, propertyValues, "retryable-exception-classes",
"retryableExceptionClasses");