diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/ExitStatus.java b/spring-batch-core/src/main/java/org/springframework/batch/core/ExitStatus.java index 29e55b888..0b0fddbd2 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/ExitStatus.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/ExitStatus.java @@ -15,7 +15,9 @@ */ package org.springframework.batch.core; +import java.io.PrintWriter; import java.io.Serializable; +import java.io.StringWriter; import org.springframework.util.StringUtils; @@ -248,4 +250,18 @@ public class ExitStatus implements Serializable, Comparable { return new ExitStatus(exitCode, buffer.toString()); } + /** + * Extract the stack trace from the throwable provided and append it to + * the exist description. + * + * @param throwable + * @return a new ExitStatus with the stack trace appended + */ + public ExitStatus addExitDescription(Throwable throwable) { + StringWriter writer = new StringWriter(); + throwable.printStackTrace(new PrintWriter(writer)); + String message = writer.toString(); + return addExitDescription(message); + } + } 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 bce32b9dd..0f981902b 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 @@ -16,8 +16,6 @@ package org.springframework.batch.core.job; -import java.io.PrintWriter; -import java.io.StringWriter; import java.util.Collection; import java.util.Date; @@ -487,10 +485,7 @@ public abstract class AbstractJob implements Job, StepLocator, BeanNameAware, In exitStatus = new ExitStatus(ExitCodeMapper.NO_SUCH_JOB, ex.getClass().getName()); } else { - StringWriter writer = new StringWriter(); - ex.printStackTrace(new PrintWriter(writer)); - String message = writer.toString(); - exitStatus = ExitStatus.FAILED.addExitDescription(message); + exitStatus = ExitStatus.FAILED.addExitDescription(ex); } return exitStatus; diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java index fdf90a2cf..b0ecb8ed2 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java @@ -15,8 +15,6 @@ */ package org.springframework.batch.core.step; -import java.io.PrintWriter; -import java.io.StringWriter; import java.util.Date; import org.apache.commons.logging.Log; @@ -341,10 +339,7 @@ public abstract class AbstractStep implements Step, InitializingBean, BeanNameAw exitStatus = new ExitStatus(ExitCodeMapper.NO_SUCH_JOB, ex.getClass().getName()); } else { - StringWriter writer = new StringWriter(); - ex.printStackTrace(new PrintWriter(writer)); - String message = writer.toString(); - exitStatus = ExitStatus.FAILED.addExitDescription(message); + exitStatus = ExitStatus.FAILED.addExitDescription(ex); } return exitStatus; diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/ExitStatusTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/ExitStatusTests.java index 2731976b6..615900d9e 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/ExitStatusTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/ExitStatusTests.java @@ -187,6 +187,15 @@ public class ExitStatusTests { assertEquals("Foo", status.getExitDescription()); } + @Test + public void testAddExitDescriptionWIthStacktrace() throws Exception { + ExitStatus status = ExitStatus.EXECUTING.addExitDescription(new RuntimeException("Foo")); + assertTrue(ExitStatus.EXECUTING != status); + String description = status.getExitDescription(); + assertTrue("Wrong description: "+description, description.contains("Foo")); + assertTrue("Wrong description: "+description, description.contains("RuntimeException")); + } + @Test public void testAddExitDescriptionToSameStatus() throws Exception { ExitStatus status = ExitStatus.EXECUTING.addExitDescription("Foo").addExitDescription("Foo"); @@ -196,7 +205,7 @@ public class ExitStatusTests { @Test public void testAddEmptyExitDescription() throws Exception { - ExitStatus status = ExitStatus.EXECUTING.addExitDescription("Foo").addExitDescription(null); + ExitStatus status = ExitStatus.EXECUTING.addExitDescription("Foo").addExitDescription((String)null); assertEquals("Foo", status.getExitDescription()); }