diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobExecutionDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobExecutionDao.java index 8281d6e18..1242e224e 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobExecutionDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobExecutionDao.java @@ -36,7 +36,7 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements private static final Log logger = LogFactory.getLog(JdbcJobExecutionDao.class); - private static final int EXIT_MESSAGE_LENGTH = 250; + private static final int DEFAULT_EXIT_MESSAGE_LENGTH = 2500; private static final String GET_JOB_EXECUTION_COUNT = "SELECT count(JOB_EXECUTION_ID) from %PREFIX%JOB_EXECUTION " + "where JOB_INSTANCE_ID = ?"; @@ -55,12 +55,23 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements private static final String GET_LAST_EXECUTION = "SELECT JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, CONTINUABLE, EXIT_CODE, EXIT_MESSAGE from %PREFIX%JOB_EXECUTION" + " where JOB_INSTANCE_ID = ? and START_TIME = (SELECT max(START_TIME) from %PREFIX%JOB_EXECUTION where JOB_INSTANCE_ID = ?)"; + private int exitMessageLength = DEFAULT_EXIT_MESSAGE_LENGTH; + private DataFieldMaxValueIncrementer jobExecutionIncrementer; private LobHandler lobHandler = new DefaultLobHandler(); private JdbcExecutionContextDao ecDao = new JdbcExecutionContextDao(); + /** + * Public setter for the exit message length in database. Do not set this if + * you haven't modified the schema. + * @param exitMessageLength the exitMessageLength to set + */ + public void setExitMessageLength(int exitMessageLength) { + this.exitMessageLength = exitMessageLength; + } + public List findJobExecutions(final JobInstance job) { Assert.notNull(job, "Job cannot be null."); @@ -140,8 +151,8 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements jobExecution.incrementVersion(); String exitDescription = jobExecution.getExitStatus().getExitDescription(); - if (exitDescription != null && exitDescription.length() > EXIT_MESSAGE_LENGTH) { - exitDescription = exitDescription.substring(0, EXIT_MESSAGE_LENGTH); + if (exitDescription != null && exitDescription.length() > exitMessageLength) { + exitDescription = exitDescription.substring(0, exitMessageLength); logger.debug("Truncating long message before update of JobExecution: " + jobExecution); } Object[] parameters = new Object[] { jobExecution.getStartTime(), jobExecution.getEndTime(), diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcStepExecutionDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcStepExecutionDao.java index e39d439cb..e1c24dffa 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcStepExecutionDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcStepExecutionDao.java @@ -58,14 +58,25 @@ public class JdbcStepExecutionDao extends AbstractJdbcBatchMetadataDao implement private static final String CURRENT_VERSION_STEP_EXECUTION = "SELECT VERSION FROM %PREFIX%STEP_EXECUTION WHERE STEP_EXECUTION_ID=?"; - private static final int EXIT_MESSAGE_LENGTH = 250; + private static final int DEFAULT_EXIT_MESSAGE_LENGTH = 2500; + + private int exitMessageLength = DEFAULT_EXIT_MESSAGE_LENGTH; private LobHandler lobHandler = new DefaultLobHandler(); private DataFieldMaxValueIncrementer stepExecutionIncrementer; - + private JdbcExecutionContextDao ecDao = new JdbcExecutionContextDao(); + /** + * Public setter for the exit message length in database. Do not set this if + * you haven't modified the schema. + * @param exitMessageLength the exitMessageLength to set + */ + public void setExitMessageLength(int exitMessageLength) { + this.exitMessageLength = exitMessageLength; + } + public ExecutionContext findExecutionContext(final StepExecution stepExecution) { return ecDao.getExecutionContext(stepExecution); @@ -86,7 +97,7 @@ public class JdbcStepExecutionDao extends AbstractJdbcBatchMetadataDao implement "to-be-saved (not updated) StepExecution can't already have a version assigned"); validateStepExecution(stepExecution); - + String exitDescription = truncateExitDescription(stepExecution.getExitStatus().getExitDescription()); stepExecution.setId(new Long(stepExecutionIncrementer.nextLongValue())); @@ -95,8 +106,8 @@ public class JdbcStepExecutionDao extends AbstractJdbcBatchMetadataDao implement stepExecution.getStepName(), stepExecution.getJobExecutionId(), stepExecution.getStartTime(), stepExecution.getEndTime(), stepExecution.getStatus().toString(), stepExecution.getCommitCount(), stepExecution.getItemCount(), stepExecution.getExitStatus().isContinuable() ? "Y" : "N", - stepExecution.getExitStatus().getExitCode(), exitDescription, - stepExecution.getReadSkipCount(), stepExecution.getWriteSkipCount(), stepExecution.getRollbackCount() }; + stepExecution.getExitStatus().getExitCode(), exitDescription, stepExecution.getReadSkipCount(), + stepExecution.getWriteSkipCount(), stepExecution.getRollbackCount() }; getJdbcTemplate().update( getQuery(SAVE_STEP_EXECUTION), parameters, @@ -131,8 +142,6 @@ public class JdbcStepExecutionDao extends AbstractJdbcBatchMetadataDao implement ecDao.saveOrUpdateExecutionContext(stepExecution); } - - /* * (non-Javadoc) * @see org.springframework.batch.execution.repository.dao.StepExecutionDao#updateStepExecution(org.springframework.batch.core.domain.StepExecution) @@ -187,9 +196,9 @@ public class JdbcStepExecutionDao extends AbstractJdbcBatchMetadataDao implement * @return truncated description */ private String truncateExitDescription(String description) { - if (description != null && description.length() > EXIT_MESSAGE_LENGTH) { + if (description != null && description.length() > exitMessageLength) { logger.debug("Truncating long message before update of StepExecution, original message is: " + description); - return description.substring(0, EXIT_MESSAGE_LENGTH); + return description.substring(0, exitMessageLength); } else { return description; diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobDaoTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobDaoTests.java index f332ea02e..7fe66a67e 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobDaoTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobDaoTests.java @@ -20,6 +20,7 @@ public class JdbcJobDaoTests extends AbstractJobDaoTests { public void testUpdateJobExecutionWithLongExitCode() { assertTrue(LONG_STRING.length() > 250); + ((JdbcJobExecutionDao) jobExecutionDao).setExitMessageLength(250); jobExecution.setExitStatus(ExitStatus.FINISHED .addExitDescription(LONG_STRING)); jobExecutionDao.updateJobExecution(jobExecution); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcStepExecutionDaoTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcStepExecutionDaoTests.java index c623ed296..c03897bdb 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcStepExecutionDaoTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcStepExecutionDaoTests.java @@ -35,6 +35,7 @@ public class JdbcStepExecutionDaoTests extends AbstractStepExecutionDaoTests { stepExecution.setExitStatus(exitStatus); + ((JdbcStepExecutionDao) dao).setExitMessageLength(250); dao.saveStepExecution(stepExecution); StepExecution retrievedAfterSave = dao.getStepExecution(jobExecution, step); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/AbstractStepTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/AbstractStepTests.java index bc5cb3285..731f5f53f 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/AbstractStepTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/AbstractStepTests.java @@ -126,8 +126,8 @@ public class AbstractStepTests extends TestCase { assertEquals("listener2#beforeStep", events.get(i++)); assertEquals("open", events.get(i++)); assertEquals("doExecute", events.get(i++)); - assertEquals("listener1#afterStep", events.get(i++)); assertEquals("listener2#afterStep", events.get(i++)); + assertEquals("listener1#afterStep", events.get(i++)); assertEquals("close", events.get(i++)); assertEquals(7, events.size()); @@ -165,8 +165,8 @@ public class AbstractStepTests extends TestCase { assertEquals("listener2#beforeStep", events.get(i++)); assertEquals("open", events.get(i++)); assertEquals("doExecute", events.get(i++)); - assertEquals("listener1#onErrorInStep", events.get(i++)); assertEquals("listener2#onErrorInStep", events.get(i++)); + assertEquals("listener1#onErrorInStep", events.get(i++)); assertEquals("close", events.get(i++)); assertEquals(7, events.size());