RESOLVED - BATCH-795: JdbcJobExecutionDao output sorting

findExecutions(JobInstance) now returns executions in the same order they were created.
This commit is contained in:
robokaso
2008-09-04 08:56:35 +00:00
parent 0e812b8da3
commit d6d6a650f0
4 changed files with 54 additions and 10 deletions

View File

@@ -50,7 +50,7 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
+ " STATUS = ?, CONTINUABLE = ?, EXIT_CODE = ?, EXIT_MESSAGE = ?, VERSION = ?, CREATE_TIME = ?, LAST_UPDATED = ? where JOB_EXECUTION_ID = ?";
private static final String FIND_JOB_EXECUTIONS = "SELECT JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, CONTINUABLE, EXIT_CODE, EXIT_MESSAGE, CREATE_TIME, LAST_UPDATED" +
" from %PREFIX%JOB_EXECUTION where JOB_INSTANCE_ID = ?";
" from %PREFIX%JOB_EXECUTION where JOB_INSTANCE_ID = ? order by JOB_EXECUTION_ID";
private static final String GET_LAST_EXECUTION = "SELECT JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, CONTINUABLE, EXIT_CODE, EXIT_MESSAGE, CREATE_TIME, LAST_UPDATED " +
"from %PREFIX%JOB_EXECUTION where JOB_INSTANCE_ID = ? and CREATE_TIME = (SELECT max(CREATE_TIME) from %PREFIX%JOB_EXECUTION where JOB_INSTANCE_ID = ?)";
@@ -59,7 +59,7 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
" from %PREFIX%JOB_EXECUTION where JOB_EXECUTION_ID = ?";
private static final String GET_RUNNING_EXECUTIONS = "SELECT JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, CONTINUABLE, EXIT_CODE, EXIT_MESSAGE, CREATE_TIME, LAST_UPDATED, " +
"JOB_INSTANCE_ID from %PREFIX%JOB_EXECUTION where END_TIME is NULL";
"JOB_INSTANCE_ID from %PREFIX%JOB_EXECUTION where END_TIME is NULL order by JOB_EXECUTION_ID";
private int exitMessageLength = DEFAULT_EXIT_MESSAGE_LENGTH;

View File

@@ -35,15 +35,14 @@ public interface JobExecutionDao {
void updateJobExecution(JobExecution jobExecution);
/**
* Return all {@link JobExecution} for given {@link JobInstance}.
*
* @param jobInstance
* @return list of jobExecutions.
* Return all {@link JobExecution} for given {@link JobInstance}, sorted
* backwards by creation order (so the first element is the most recent).
*/
List<JobExecution> findJobExecutions(JobInstance jobInstance);
/**
* Find the last {@link JobExecution} to have been created for a given {@link JobInstance}.
* Find the last {@link JobExecution} to have been created for a given
* {@link JobInstance}.
* @param jobInstance the {@link JobInstance}
* @return the last {@link JobExecution} to execute for this instance
*/
@@ -59,10 +58,11 @@ public interface JobExecutionDao {
* @return the {@link JobExecution} for given identifier.
*/
JobExecution getJobExecution(Long executionId);
/**
* Because it may be possible that the status of a JobExecution is updated while running,
* the following method while synchronize only the status field.
* Because it may be possible that the status of a JobExecution is updated
* while running, the following method while synchronize only the status
* field.
*
* @param jobExecution to be updated.
*/

View File

@@ -1,6 +1,8 @@
package org.springframework.batch.core.repository.dao;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -39,6 +41,20 @@ public class MapJobExecutionDao implements JobExecutionDao {
executions.add(exec);
}
}
Collections.sort(executions, new Comparator<JobExecution>() {
public int compare(JobExecution e1, JobExecution e2) {
long result = (e1.getId() - e2.getId());
if (result > 0) {
return 1;
} else if (result < 0) {
return -1;
} else {
return 0;
}
}
});
return executions;
}

View File

@@ -5,6 +5,7 @@ import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
@@ -14,6 +15,7 @@ import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.transaction.annotation.Transactional;
@@ -51,6 +53,8 @@ public abstract class AbstractJobExecutionDaoTests extends AbstractTransactional
execution.setStartTime(new Date(System.currentTimeMillis()));
execution.setLastUpdated(new Date(System.currentTimeMillis()));
execution.setExitStatus(ExitStatus.UNKNOWN);
execution.setEndTime(new Date(System.currentTimeMillis()));
dao.saveJobExecution(execution);
List<JobExecution> executions = dao.findJobExecutions(jobInstance);
@@ -58,6 +62,30 @@ public abstract class AbstractJobExecutionDaoTests extends AbstractTransactional
assertEquals(execution, executions.get(0));
assertExecutionsAreEqual(execution, executions.get(0));
}
/**
* Executions should be returned in the same order they were saved.
*/
@Transactional
@Test
public void testFindExecutionsOrdering() {
List<JobExecution> execs = new ArrayList<JobExecution>();
for (int i = 0; i < 10; i++) {
JobExecution exec = new JobExecution(jobInstance);
exec.setCreateTime(new Date(i));
execs.add(exec);
dao.saveJobExecution(exec);
}
List<JobExecution> retrieved = dao.findJobExecutions(jobInstance);
for (int i = 0; i < 10; i++) {
assertExecutionsAreEqual(execs.get(i), retrieved.get(i));
}
}
/**
* Save and find a job execution.