From 60dfdf87bcc1b965e1b69ffa0be674a46188f9fa Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Mon, 23 Jul 2012 11:52:43 +0100 Subject: [PATCH] BATCH-1822: JobExecution should be UNKNOWN if Step finishes that way --- .../batch/core/JobInterruptedException.java | 16 ++++++++++++++++ .../batch/core/job/AbstractJob.java | 2 +- .../batch/core/job/flow/JobFlowExecutor.java | 2 +- .../batch/core/job/SimpleJobTests.java | 15 ++++++++++++++- .../batch/core/job/flow/FlowJobTests.java | 4 ++-- 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/JobInterruptedException.java b/spring-batch-core/src/main/java/org/springframework/batch/core/JobInterruptedException.java index dc64368bc..8d2ba0d51 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/JobInterruptedException.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/JobInterruptedException.java @@ -29,8 +29,24 @@ package org.springframework.batch.core; * */ public class JobInterruptedException extends JobExecutionException { + + private BatchStatus status = BatchStatus.STOPPED; public JobInterruptedException(String msg) { super(msg); } + + public JobInterruptedException(String msg, BatchStatus status) { + super(msg); + this.status = status; + } + + /** + * The desired status of the surrounding execution after the interruption. + * + * @return the status of the interruption (default STOPPED) + */ + public BatchStatus getStatus() { + return status; + } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java index fccb0d34b..25ffc629b 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java @@ -312,7 +312,7 @@ public abstract class AbstractJob implements Job, StepLocator, BeanNameAware, logger.debug("Full exception", e); } execution.setExitStatus(getDefaultExitStatusForFailure(e)); - execution.setStatus(BatchStatus.STOPPED); + execution.setStatus(BatchStatus.max(BatchStatus.STOPPED, e.getStatus())); execution.addFailureException(e); } catch (Throwable t) { logger.error("Encountered fatal error executing job", t); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/JobFlowExecutor.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/JobFlowExecutor.java index 367dadd22..6017d086e 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/JobFlowExecutor.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/JobFlowExecutor.java @@ -64,7 +64,7 @@ public class JobFlowExecutor implements FlowExecutor { return ExitStatus.COMPLETED.getExitCode(); } if (stepExecution.isTerminateOnly()) { - throw new JobInterruptedException("Step requested termination: "+stepExecution); + throw new JobInterruptedException("Step requested termination: "+stepExecution, stepExecution.getStatus()); } return stepExecution.getExitStatus().getExitCode(); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java index 66c98c255..e745f1c01 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java @@ -260,6 +260,19 @@ public class SimpleJobTests { checkRepository(BatchStatus.STOPPED, ExitStatus.STOPPED); } + @Test + public void testInterruptedAfterUnknownStatus() throws Exception { + step1.setStartLimit(5); + step2.setStartLimit(5); + final JobInterruptedException exception = new JobInterruptedException("Interrupt!", BatchStatus.UNKNOWN); + step1.setProcessException(exception); + job.execute(jobExecution); + assertEquals(1, jobExecution.getAllFailureExceptions().size()); + assertEquals(exception, jobExecution.getStepExecutions().iterator().next().getFailureExceptions().get(0)); + assertEquals(0, list.size()); + checkRepository(BatchStatus.UNKNOWN, ExitStatus.STOPPED); + } + @Test public void testFailed() throws Exception { step1.setStartLimit(5); @@ -573,7 +586,7 @@ public class SimpleJobTests { if (exception instanceof JobInterruptedException) { stepExecution.setExitStatus(ExitStatus.FAILED); - stepExecution.setStatus(BatchStatus.FAILED); + stepExecution.setStatus(((JobInterruptedException) exception).getStatus()); stepExecution.addFailureException(exception); throw (JobInterruptedException) exception; } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowJobTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowJobTests.java index 75148b3c9..73d5aa402 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowJobTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowJobTests.java @@ -227,8 +227,8 @@ public class FlowJobTests { job.setFlow(flow); job.afterPropertiesSet(); job.execute(jobExecution); - assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); - checkRepository(BatchStatus.STOPPED, ExitStatus.STOPPED); + assertEquals(BatchStatus.UNKNOWN, jobExecution.getStatus()); + checkRepository(BatchStatus.UNKNOWN, ExitStatus.STOPPED); assertEquals(1, jobExecution.getAllFailureExceptions().size()); assertEquals(JobInterruptedException.class, jobExecution.getFailureExceptions().get(0).getClass()); }