diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/SimpleJobExplorer.java b/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/SimpleJobExplorer.java index eb25a2468..b2a48c7e2 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/SimpleJobExplorer.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/SimpleJobExplorer.java @@ -120,7 +120,7 @@ public class SimpleJobExplorer implements JobExplorer { * @see org.springframework.batch.core.explore.JobExplorer#getLastJobInstances(java.lang.String, int) */ public List getJobInstances(String jobName, int start, int count) { - return jobInstanceDao.getLastJobInstances(jobName, count); + return jobInstanceDao.getJobInstances(jobName, start, count); } /* diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobOperator.java b/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobOperator.java index 3db303894..9a51e9bd0 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobOperator.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobOperator.java @@ -369,7 +369,6 @@ public class SimpleJobOperator implements JobOperator, InitializingBean { jobExecution.setStatus(BatchStatus.STOPPING); jobRepository.update(jobExecution); - // TODO: I'm not sure that we can really know if the execution stopped return true; } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDao.java index 8200d1cfb..1cdadecc3 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDao.java @@ -250,7 +250,7 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements * @seeorg.springframework.batch.core.repository.dao.JobInstanceDao# * getLastJobInstances(java.lang.String, int) */ - public List getLastJobInstances(String jobName, final int count) { + public List getJobInstances(String jobName, final int start, final int count) { ResultSetExtractor extractor = new ResultSetExtractor() { @@ -258,7 +258,10 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements public Object extractData(ResultSet rs) throws SQLException, DataAccessException { int rowNum = 0; - while (rowNum < count && rs.next()) { + while (rowNum < start && rs.next()) { + rowNum++; + } + while (rowNum < start + count && rs.next()) { ParameterizedRowMapper rowMapper = new JobInstanceRowMapper(); list.add(rowMapper.mapRow(rs, rowNum)); rowNum++; diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JobExecutionDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JobExecutionDao.java index 4e4218ebb..5bde5114b 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JobExecutionDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JobExecutionDao.java @@ -61,7 +61,7 @@ public interface JobExecutionDao { /** * Because it may be possible that the status of a JobExecution is updated - * while running, the following method while synchronize only the status and + * while running, the following method will synchronize only the status and * version fields. * * @param jobExecution to be updated. diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JobInstanceDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JobInstanceDao.java index 742b5d147..aef6046e5 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JobInstanceDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JobInstanceDao.java @@ -63,10 +63,11 @@ public interface JobInstanceDao { * * * @param jobName the job name - * @param count the number of objects to return + * @param start the start index of the instances to return + * @param count the maximum number of objects to return * @return the job instances with this name or empty if none */ - List getLastJobInstances(String jobName, int count); + List getJobInstances(String jobName, int start, int count); /** * Retrieve the names of all job instances sorted alphabetically - i.e. jobs diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobInstanceDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobInstanceDao.java index 7a77653de..21a354b7e 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobInstanceDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobInstanceDao.java @@ -65,7 +65,7 @@ public class MapJobInstanceDao implements JobInstanceDao { return result; } - public List getLastJobInstances(String jobName, int count) { + public List getJobInstances(String jobName, int start, int count) { List result = new ArrayList(); for (JobInstance instance : jobInstances) { if (instance.getJobName().equals(jobName)) { @@ -78,8 +78,13 @@ public class MapJobInstanceDao implements JobInstanceDao { return Long.signum(o2.getId() - o1.getId()); } }); - int length = count > result.size() ? result.size() : count; - return result.subList(0, length); + if (start>=result.size()) { + start = result.size(); + } + if (start + count >=result.size()) { + count = result.size(); + } + return result.subList(start, count); } public JobInstance getJobInstance(JobExecution jobExecution) { diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/exlore/support/SimpleJobExplorerTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/exlore/support/SimpleJobExplorerTests.java index cd614c09b..a760e8974 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/exlore/support/SimpleJobExplorerTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/exlore/support/SimpleJobExplorerTests.java @@ -124,7 +124,7 @@ public class SimpleJobExplorerTests extends TestCase { @Test public void testGetLastJobInstances() throws Exception { - jobInstanceDao.getLastJobInstances("foo", 1); + jobInstanceDao.getJobInstances("foo", 0, 1); EasyMock.expectLastCall().andReturn(Collections.singletonList(jobInstance)); replay(jobExecutionDao, jobInstanceDao, stepExecutionDao); jobExplorer.getJobInstances("foo", 0, 1); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractJobInstanceDaoTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractJobInstanceDaoTests.java index b96c5b810..b95725a64 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractJobInstanceDaoTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractJobInstanceDaoTests.java @@ -126,7 +126,7 @@ public abstract class AbstractJobInstanceDaoTests extends AbstractTransactionalJ // we need two instances of the same job to check ordering dao.createJobInstance(fooJob, new JobParameters()); - List jobInstances = dao.getLastJobInstances(fooJob, 2); + List jobInstances = dao.getJobInstances(fooJob, 0, 2); assertEquals(2, jobInstances.size()); assertEquals(fooJob, jobInstances.get(0).getJobName()); assertEquals(fooJob, jobInstances.get(1).getJobName()); @@ -137,6 +137,48 @@ public abstract class AbstractJobInstanceDaoTests extends AbstractTransactionalJ } + /** + * Create and retrieve a job instance. + */ + @Transactional + @Test + public void testGetLastInstancesPaged() throws Exception { + + testCreateAndRetrieve(); + + // unrelated job instance that should be ignored by the query + dao.createJobInstance("anotherJob", new JobParameters()); + + // we need two instances of the same job to check ordering + dao.createJobInstance(fooJob, new JobParameters()); + + List jobInstances = dao.getJobInstances(fooJob, 1, 2); + assertEquals(1, jobInstances.size()); + assertEquals(fooJob, jobInstances.get(0).getJobName()); + assertEquals(Integer.valueOf(0), jobInstances.get(0).getVersion()); + + } + + /** + * Create and retrieve a job instance. + */ + @Transactional + @Test + public void testGetLastInstancesPastEnd() throws Exception { + + testCreateAndRetrieve(); + + // unrelated job instance that should be ignored by the query + dao.createJobInstance("anotherJob", new JobParameters()); + + // we need two instances of the same job to check ordering + dao.createJobInstance(fooJob, new JobParameters()); + + List jobInstances = dao.getJobInstances(fooJob, 4, 2); + assertEquals(0, jobInstances.size()); + + } + /** * Trying to create instance twice for the same job+parameters causes error */