BATCH-1396: added step scope to skip policy in chunk parser
This commit is contained in:
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user