IN PROGRESS - issue BATCH-453: Killed batches cannot be restarted

http://jira.springframework.org/browse/BATCH-453

Minor adjustments to repository dao's (JobExecution no longer needs instance and step execution)
This commit is contained in:
lucasward
2008-08-28 20:26:52 +00:00
parent 6919398745
commit f25fbb5c15
23 changed files with 192 additions and 104 deletions

View File

@@ -31,7 +31,7 @@ import org.springframework.batch.repeat.ExitStatus;
*/
public class JobExecution extends Entity {
private final JobInstance jobInstance;
private JobInstance jobInstance;
private volatile transient Collection<StepExecution> stepExecutions = new HashSet<StepExecution>();
@@ -68,11 +68,19 @@ public class JobExecution extends Entity {
public JobExecution(JobInstance job) {
this(job, null);
}
public JobExecution(Long id){
super(id);
}
public Date getEndTime() {
return endTime;
}
public void setJobInstance(JobInstance jobInstance) {
this.jobInstance = jobInstance;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}

View File

@@ -19,7 +19,8 @@ package org.springframework.batch.core;
* Interface for obtaining the next {@link JobParameters} in a sequence.
*
* @author Dave Syer
*
* @author Lucas Ward
* @since 2.0
*/
public interface JobParametersIncrementer {

View File

@@ -3,6 +3,7 @@ package org.springframework.batch.core.explore.support;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.repository.dao.JobExecutionDao;
import org.springframework.batch.core.repository.dao.JobInstanceDao;
import org.springframework.batch.core.repository.dao.StepExecutionDao;
import org.springframework.beans.factory.FactoryBean;
/**
@@ -26,6 +27,8 @@ public abstract class AbstractJobExplorerFactoryBean implements FactoryBean {
* @return fully configured {@link JobExecutionDao} implementation.
*/
protected abstract JobExecutionDao createJobExecutionDao() throws Exception;
protected abstract StepExecutionDao createStepExecutionDao() throws Exception;
/**
* The type of object to be returned from {@link #getObject()}.

View File

@@ -99,7 +99,7 @@ public class JobExplorerFactoryBean extends AbstractJobExplorerFactoryBean imple
}
private Object getTarget() throws Exception {
return new SimpleJobExplorer(createJobInstanceDao(), createJobExecutionDao());
return new SimpleJobExplorer(createJobInstanceDao(), createJobExecutionDao(), createStepExecutionDao());
}
@Override
@@ -118,8 +118,6 @@ public class JobExplorerFactoryBean extends AbstractJobExplorerFactoryBean imple
dao.setJdbcTemplate(jdbcTemplate);
dao.setJobExecutionIncrementer(incrementerFactory.getIncrementer(databaseType, tablePrefix
+ "JOB_EXECUTION_SEQ"));
dao.setJobInstanceDao(createJobInstanceDao());
dao.setStepExecutionDao(createStepExecutionDao());
dao.setTablePrefix(tablePrefix);
dao.afterPropertiesSet();
return dao;

View File

@@ -4,6 +4,8 @@ import org.springframework.batch.core.repository.dao.JobExecutionDao;
import org.springframework.batch.core.repository.dao.JobInstanceDao;
import org.springframework.batch.core.repository.dao.MapJobExecutionDao;
import org.springframework.batch.core.repository.dao.MapJobInstanceDao;
import org.springframework.batch.core.repository.dao.MapStepExecutionDao;
import org.springframework.batch.core.repository.dao.StepExecutionDao;
import org.springframework.beans.factory.FactoryBean;
/**
@@ -23,9 +25,15 @@ public class MapJobExplorerFactoryBean extends AbstractJobExplorerFactoryBean {
protected JobInstanceDao createJobInstanceDao() throws Exception {
return new MapJobInstanceDao();
}
@Override
protected StepExecutionDao createStepExecutionDao() throws Exception {
// TODO Auto-generated method stub
return new MapStepExecutionDao();
}
public Object getObject() throws Exception {
return new SimpleJobExplorer(createJobInstanceDao(), createJobExecutionDao());
return new SimpleJobExplorer(createJobInstanceDao(), createJobExecutionDao(), createStepExecutionDao());
}
}

View File

@@ -34,18 +34,21 @@ import org.springframework.batch.core.repository.dao.StepExecutionDao;
* <p>
*
* @author Dave Syer
* @author Lucas Ward
*
* @see JobExplorer
* @see JobInstanceDao
* @see JobExecutionDao
* @see StepExecutionDao
*
* @since 2.0
*/
public class SimpleJobExplorer implements JobExplorer {
private JobInstanceDao jobInstanceDao;
private JobExecutionDao jobExecutionDao;
private StepExecutionDao stepExecutionDao;
/**
* Provide default constructor with low visibility in case user wants to use
@@ -54,31 +57,42 @@ public class SimpleJobExplorer implements JobExplorer {
SimpleJobExplorer() {
}
public SimpleJobExplorer(JobInstanceDao jobInstanceDao, JobExecutionDao jobExecutionDao) {
public SimpleJobExplorer(JobInstanceDao jobInstanceDao, JobExecutionDao jobExecutionDao, StepExecutionDao stepExecutionDao) {
super();
this.jobInstanceDao = jobInstanceDao;
this.jobExecutionDao = jobExecutionDao;
this.stepExecutionDao = stepExecutionDao;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.explore.JobExplorer#findJobExecutions(org.springframework.batch.core.JobInstance)
*/
public List<JobExecution> findJobExecutions(JobInstance jobInstance) {
return jobExecutionDao.findJobExecutions(jobInstance);
List<JobExecution> executions = jobExecutionDao.findJobExecutions(jobInstance);
for(JobExecution jobExecution:executions){
getJobExecutionDependencies(jobExecution);
}
return executions;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.explore.JobExplorer#findRunningJobExecutions(java.lang.String)
*/
public Set<JobExecution> findRunningJobExecutions(String jobName) {
return jobExecutionDao.findRunningJobExecutions(jobName);
Set<JobExecution> executions = jobExecutionDao.findRunningJobExecutions(jobName);
for(JobExecution jobExecution:executions){
getJobExecutionDependencies(jobExecution);
}
return executions;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.explore.JobExplorer#getJobExecution(java.lang.Long)
*/
public JobExecution getJobExecution(Long executionId) {
return jobExecutionDao.getJobExecution(executionId);
JobExecution jobExecution = jobExecutionDao.getJobExecution(executionId);
getJobExecutionDependencies(jobExecution);
return jobExecution;
}
/* (non-Javadoc)
@@ -101,5 +115,16 @@ public class SimpleJobExplorer implements JobExplorer {
public boolean isJobInstanceExists(String jobName, JobParameters jobParameters) {
return jobInstanceDao.getJobInstance(jobName, jobParameters)!=null;
}
/*
* Find all dependencies for a JobExecution, including JobInstance (which requires JobParameters)
* plus StepExecutions
*/
private void getJobExecutionDependencies(JobExecution jobExecution){
JobInstance jobInstance = jobInstanceDao.getJobInstance(jobExecution);
stepExecutionDao.getStepExecutions(jobExecution);
jobExecution.setJobInstance(jobInstance);
}
}

View File

@@ -55,8 +55,6 @@ 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, 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 = ?)";
private static final String GET_INSTANCE_BY_EXECUTION_ID = "SELECT JOB_INSTANCE_ID from %PREFIX%JOB_EXECUTION where JOB_EXECUTION_ID = ?";
private static final String GET_EXECUTION_BY_ID = "SELECT JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, CONTINUABLE, EXIT_CODE, EXIT_MESSAGE, CREATE_TIME, LAST_UPDATED" +
" from %PREFIX%JOB_EXECUTION where JOB_EXECUTION_ID = ?";
@@ -67,10 +65,6 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
private DataFieldMaxValueIncrementer jobExecutionIncrementer;
private JobInstanceDao jobInstanceDao;
private StepExecutionDao stepExecutionDao;
/**
* Public setter for the exit message length in database. Do not set this if
* you haven't modified the schema.
@@ -90,27 +84,9 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
this.jobExecutionIncrementer = jobExecutionIncrementer;
}
/**
* Public setter for the {@link JobInstanceDao}.
* @param jobInstanceDao the {@link JobInstanceDao} to set
*/
public void setJobInstanceDao(JobInstanceDao jobInstanceDao) {
this.jobInstanceDao = jobInstanceDao;
}
/**
* Public setter for the {@link StepExecutionDao}.
* @param stepExecutionDao the {@link StepExecutionDao} to set
*/
public void setStepExecutionDao(StepExecutionDao stepExecutionDao) {
this.stepExecutionDao = stepExecutionDao;
}
public void afterPropertiesSet() throws Exception {
super.afterPropertiesSet();
Assert.notNull(jobExecutionIncrementer);
Assert.notNull(jobInstanceDao);
Assert.notNull(stepExecutionDao);
}
public List<JobExecution> findJobExecutions(final JobInstance job) {
@@ -233,11 +209,8 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
*/
public JobExecution getJobExecution(Long executionId) {
try {
Long instanceId = getJdbcTemplate().queryForLong(getQuery(GET_INSTANCE_BY_EXECUTION_ID), executionId);
JobInstance jobInstance = jobInstanceDao.getJobInstance(instanceId);
JobExecution jobExecution = getJdbcTemplate().queryForObject(getQuery(GET_EXECUTION_BY_ID),
new JobExecutionRowMapper(jobInstance), executionId);
stepExecutionDao.getStepExecutions(jobExecution);
new JobExecutionRowMapper(), executionId);
return jobExecution;
}
catch (EmptyResultDataAccessException e) {
@@ -256,18 +229,12 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
final Set<JobExecution> result = new HashSet<JobExecution>();
RowCallbackHandler handler = new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
Long instanceId = rs.getLong("JOB_INSTANCE_ID");
JobInstance jobInstance = jobInstanceDao.getJobInstance(instanceId);
JobExecutionRowMapper mapper = new JobExecutionRowMapper(jobInstance);
JobExecutionRowMapper mapper = new JobExecutionRowMapper();
result.add(mapper.mapRow(rs, 0));
}
};
getJdbcTemplate().getJdbcOperations().query(getQuery(GET_RUNNING_EXECUTIONS), handler);
for (JobExecution jobExecution : result) {
stepExecutionDao.getStepExecutions(jobExecution);
}
return result;
}
@@ -285,16 +252,26 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
*/
private class JobExecutionRowMapper implements ParameterizedRowMapper<JobExecution> {
private JobInstance job;
public JobExecutionRowMapper(JobInstance job) {
super();
this.job = job;
private JobInstance jobInstance;
public JobExecutionRowMapper() {
}
public JobExecutionRowMapper(JobInstance jobInstance) {
this.jobInstance = jobInstance;
}
public JobExecution mapRow(ResultSet rs, int rowNum) throws SQLException {
JobExecution jobExecution = new JobExecution(job);
jobExecution.setId(new Long(rs.getLong(1)));
Long id = new Long(rs.getLong(1));
JobExecution jobExecution;
if(jobInstance == null){
jobExecution = new JobExecution(id);
}
else{
jobExecution = new JobExecution(jobInstance, id);
}
jobExecution.setStartTime(rs.getTimestamp(2));
jobExecution.setEndTime(rs.getTimestamp(3));
jobExecution.setStatus(BatchStatus.valueOf(rs.getString(4)));

View File

@@ -10,6 +10,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameter;
import org.springframework.batch.core.JobParameters;
@@ -52,6 +53,9 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
private static final String FIND_JOBS_WITH_EMPTY_KEY = "SELECT JOB_INSTANCE_ID, JOB_NAME from %PREFIX%JOB_INSTANCE where JOB_NAME = ? and (JOB_KEY = ? OR JOB_KEY is NULL)";
private static final String GET_JOB_FROM_ID = "SELECT JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION from %PREFIX%JOB_INSTANCE where JOB_INSTANCE_ID = ?";
private static final String GET_JOB_FROM_EXECUTION_ID = "SELECT JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION from %PREFIX%JOB_INSTANCE ji, " +
"%PREFIX%JOB_EXECUTION je where JOB_EXECUTION_ID = ? and ji.JOB_INSTANCE_ID = je.JOB_INSTANCE_ID";
private static final String FIND_PARAMS_FROM_ID = "SELECT JOB_INSTANCE_ID, KEY_NAME, TYPE_CD, "
+ "STRING_VAL, DATE_VAL, LONG_VAL, DOUBLE_VAL from %PREFIX%JOB_PARAMS where JOB_INSTANCE_ID = ?";
@@ -182,10 +186,8 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
*/
public JobInstance getJobInstance(Long instanceId) {
final JobParameters jobParameters = getJobParameters(instanceId);
ParameterizedRowMapper<JobInstance> rowMapper = new JobInstanceRowMapper(jobParameters);
try {
return getJdbcTemplate().queryForObject(getQuery(GET_JOB_FROM_ID), rowMapper, instanceId);
return getJdbcTemplate().queryForObject(getQuery(GET_JOB_FROM_ID), new JobInstanceRowMapper(), instanceId);
}
catch (EmptyResultDataAccessException e) {
return null;
@@ -250,8 +252,7 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
int rowNum = 0;
while (rowNum < count && rs.next()) {
final JobParameters jobParameters = getJobParameters(rs.getLong(1));
ParameterizedRowMapper<JobInstance> rowMapper = new JobInstanceRowMapper(jobParameters);
ParameterizedRowMapper<JobInstance> rowMapper = new JobInstanceRowMapper();
list.add(rowMapper.mapRow(rs, rowNum));
rowNum++;
}
@@ -266,6 +267,19 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
return result;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.repository.dao.JobInstanceDao#getJobInstance(org.springframework.batch.core.JobExecution)
*/
public JobInstance getJobInstance(JobExecution jobExecution) {
try {
return getJdbcTemplate().queryForObject(getQuery(GET_JOB_FROM_EXECUTION_ID), new JobInstanceRowMapper(), jobExecution.getId());
}
catch (EmptyResultDataAccessException e) {
return null;
}
}
/**
* Setter for {@link DataFieldMaxValueIncrementer} to be used when
@@ -288,18 +302,25 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
*/
private final class JobInstanceRowMapper implements ParameterizedRowMapper<JobInstance> {
private final JobParameters jobParameters;
private JobInstanceRowMapper(JobParameters jobParameters) {
private JobParameters jobParameters;
public JobInstanceRowMapper() {
}
public JobInstanceRowMapper(JobParameters jobParameters) {
this.jobParameters = jobParameters;
}
public JobInstance mapRow(ResultSet rs, int rowNum) throws SQLException {
Long id = rs.getLong(1);
if(jobParameters == null){
jobParameters = getJobParameters(id);
}
JobInstance jobInstance = new JobInstance(new Long(rs.getLong(1)), jobParameters, rs.getString(2));
// should always be at version=0 because they never get updated
jobInstance.incrementVersion();
return jobInstance;
}
}
}

View File

@@ -2,6 +2,7 @@ package org.springframework.batch.core.repository.dao;
import java.util.List;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
@@ -48,6 +49,14 @@ public interface JobInstanceDao {
*/
JobInstance getJobInstance(Long instanceId);
/**
* Fetch the JobInstance for the provided JobExecution.
*
* @param jobExecution the JobExecution
* @return the JobInstance for the provided execution or null if it doesn't exist.
*/
JobInstance getJobInstance(JobExecution jobExecution);
/**
* Fetch the last job instances with the provided name, sorted backwards by
* primary key.

View File

@@ -6,6 +6,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.support.transaction.TransactionAwareProxyFactory;
@@ -85,4 +86,8 @@ public class MapJobInstanceDao implements JobInstanceDao {
return list.subList(0, length);
}
public JobInstance getJobInstance(JobExecution jobExecution) {
return jobExecution.getJobInstance();
}
}

View File

@@ -180,8 +180,6 @@ public class JobRepositoryFactoryBean extends AbstractJobRepositoryFactoryBean i
dao.setJdbcTemplate(jdbcTemplate);
dao.setJobExecutionIncrementer(incrementerFactory.getIncrementer(databaseType, tablePrefix
+ "JOB_EXECUTION_SEQ"));
dao.setJobInstanceDao(createJobInstanceDao());
dao.setStepExecutionDao(createStepExecutionDao());
dao.setTablePrefix(tablePrefix);
dao.afterPropertiesSet();
return dao;

View File

@@ -1,4 +1,11 @@
CREATE TABLE BATCH_MAP_STORE (
MAP_STORE_ID ${BIGINT} $!{IDENTITY} NOT NULL PRIMARY KEY $!{GENERATED},
OBJECT_VAL ${BLOB} NOT NULL
CREATE TABLE BATCH_EXECUTION_CONTEXT (
EXECUTION_ID ${BIGINT} NOT NULL,
DISCRIMINATOR ${VARCHAR}(1) NOT NULL,
TYPE_CD ${VARCHAR}(6) NOT NULL,
KEY_NAME ${VARCHAR}(1000) NOT NULL,
STRING_VAL ${VARCHAR}(1000) $!{NULL},
DATE_VAL ${TIMESTAMP} DEFAULT NULL,
LONG_VAL ${BIGINT} $!{NULL},
DOUBLE_VAL ${DOUBLE} $!{NULL},
OBJECT_VAL ${BLOB} $!{NULL}
) $!{VOODOO};

View File

@@ -100,7 +100,7 @@ public class JobExecutionTests extends TestCase {
* {@link org.springframework.batch.core.JobExecution#getJobId()}.
*/
public void testGetJobIdForNullJob() {
execution = new JobExecution(null);
execution = new JobExecution(null, null);
assertEquals(null, execution.getJobId());
}

View File

@@ -14,7 +14,12 @@ import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
/**
*
*
* @author Lucas Ward
*
*/
public class ClassPathXmlJobRegistryTests {
ClassPathXmlJobRegistry registry;

View File

@@ -117,7 +117,7 @@ public class JobExplorerFactoryBeanTests {
expect(incrementerFactory.isSupportedIncrementerType("foo")).andReturn(true);
expect(incrementerFactory.getSupportedIncrementerTypes()).andReturn(new String[0]);
expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_SEQ")).andReturn(new StubIncrementer()).times(2);
expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_SEQ")).andReturn(new StubIncrementer());
expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_EXECUTION_SEQ")).andReturn(new StubIncrementer());
expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "STEP_EXECUTION_SEQ")).andReturn(new StubIncrementer());
replay(incrementerFactory);

View File

@@ -16,7 +16,7 @@
package org.springframework.batch.core.exlore.support;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.*;
import java.util.Collections;
@@ -30,6 +30,7 @@ import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.explore.support.SimpleJobExplorer;
import org.springframework.batch.core.repository.dao.JobExecutionDao;
import org.springframework.batch.core.repository.dao.JobInstanceDao;
import org.springframework.batch.core.repository.dao.StepExecutionDao;
/**
* Test {@link SimpleJobExplorer}.
@@ -44,6 +45,8 @@ public class SimpleJobExplorerTests extends TestCase {
JobExecutionDao jobExecutionDao;
JobInstanceDao jobInstanceDao;
StepExecutionDao stepExecutionDao;
JobInstance jobInstance = new JobInstance(111L, new JobParameters(), "job");
@@ -53,72 +56,76 @@ public class SimpleJobExplorerTests extends TestCase {
jobExecutionDao = createMock(JobExecutionDao.class);
jobInstanceDao = createMock(JobInstanceDao.class);
stepExecutionDao = createMock(StepExecutionDao.class);
jobExplorer = new SimpleJobExplorer(jobInstanceDao, jobExecutionDao);
jobExplorer = new SimpleJobExplorer(jobInstanceDao, jobExecutionDao, stepExecutionDao);
}
@Test
public void testGetJobExecution() throws Exception {
jobExecutionDao.getJobExecution(123L);
EasyMock.expectLastCall().andReturn(jobExecution);
EasyMock.replay(jobExecutionDao, jobInstanceDao);
expect(jobExecutionDao.getJobExecution(123L)).andReturn(jobExecution);
expect(jobInstanceDao.getJobInstance(jobExecution)).andReturn(jobInstance);
expect(stepExecutionDao.getStepExecutions(jobExecution)).andReturn(null);
replay(jobExecutionDao, jobInstanceDao, stepExecutionDao);
jobExplorer.getJobExecution(123L);
EasyMock.verify(jobExecutionDao, jobInstanceDao);
verify(jobExecutionDao, jobInstanceDao, stepExecutionDao);
}
@Test
public void testFindRunningJobExecutions() throws Exception {
jobExecutionDao.findRunningJobExecutions("job");
EasyMock.expectLastCall().andReturn(Collections.singleton(jobExecution));
EasyMock.replay(jobExecutionDao, jobInstanceDao);
expect(jobExecutionDao.findRunningJobExecutions("job")).andReturn(Collections.singleton(jobExecution));
expect(jobInstanceDao.getJobInstance(jobExecution)).andReturn(jobInstance);
expect(stepExecutionDao.getStepExecutions(jobExecution)).andReturn(null);
replay(jobExecutionDao, jobInstanceDao, stepExecutionDao);
jobExplorer.findRunningJobExecutions("job");
EasyMock.verify(jobExecutionDao, jobInstanceDao);
verify(jobExecutionDao, jobInstanceDao, stepExecutionDao);
}
@Test
public void testFindJobExecutions() throws Exception {
jobExecutionDao.findJobExecutions(jobInstance);
EasyMock.expectLastCall().andReturn(Collections.singletonList(jobExecution));
EasyMock.replay(jobExecutionDao, jobInstanceDao);
expect(jobExecutionDao.findJobExecutions(jobInstance)).andReturn(Collections.singletonList(jobExecution));
expect(jobInstanceDao.getJobInstance(jobExecution)).andReturn(jobInstance);
expect(stepExecutionDao.getStepExecutions(jobExecution)).andReturn(null);
replay(jobExecutionDao, jobInstanceDao, stepExecutionDao);
jobExplorer.findJobExecutions(jobInstance);
EasyMock.verify(jobExecutionDao, jobInstanceDao);
verify(jobExecutionDao, jobInstanceDao, stepExecutionDao);
}
@Test
public void testGetJobInstance() throws Exception {
jobInstanceDao.getJobInstance(111L);
EasyMock.expectLastCall().andReturn(jobInstance);
EasyMock.replay(jobExecutionDao, jobInstanceDao);
replay(jobExecutionDao, jobInstanceDao, stepExecutionDao);
jobExplorer.getJobInstance(111L);
EasyMock.verify(jobExecutionDao, jobInstanceDao);
verify(jobExecutionDao, jobInstanceDao, stepExecutionDao);
}
@Test
public void testGetLastJobInstances() throws Exception {
jobInstanceDao.getLastJobInstances("foo", 1);
EasyMock.expectLastCall().andReturn(Collections.singletonList(jobInstance));
EasyMock.replay(jobExecutionDao, jobInstanceDao);
replay(jobExecutionDao, jobInstanceDao, stepExecutionDao);
jobExplorer.getLastJobInstances("foo", 1);
EasyMock.verify(jobExecutionDao, jobInstanceDao);
verify(jobExecutionDao, jobInstanceDao, stepExecutionDao);
}
@Test
public void testIsJobInstanceFalse() throws Exception {
jobInstanceDao.getJobInstance("foo", new JobParameters());
EasyMock.expectLastCall().andReturn(null);
EasyMock.replay(jobExecutionDao, jobInstanceDao);
replay(jobExecutionDao, jobInstanceDao, stepExecutionDao);
assertFalse(jobExplorer.isJobInstanceExists("foo", new JobParameters()));
EasyMock.verify(jobExecutionDao, jobInstanceDao);
verify(jobExecutionDao, jobInstanceDao, stepExecutionDao);
}
@Test
public void testIsJobInstanceTrue() throws Exception {
jobInstanceDao.getJobInstance("foo", new JobParameters());
EasyMock.expectLastCall().andReturn(jobInstance);
EasyMock.replay(jobExecutionDao, jobInstanceDao);
replay(jobExecutionDao, jobInstanceDao, stepExecutionDao);
assertTrue(jobExplorer.isJobInstanceExists("foo", new JobParameters()));
EasyMock.verify(jobExecutionDao, jobInstanceDao);
verify(jobExecutionDao, jobInstanceDao, stepExecutionDao);
}
}

View File

@@ -64,7 +64,7 @@ public class SimpleJobLauncherTests {
@Test
public void testRun() throws Exception {
JobExecution jobExecution = new JobExecution(null);
JobExecution jobExecution = new JobExecution(null, null);
expect(jobRepository.createJobExecution(job, jobParameters)).andReturn(jobExecution);

View File

@@ -160,7 +160,6 @@ public abstract class AbstractJobExecutionDaoTests extends AbstractTransactional
JobExecution value = values.iterator().next();
assertEquals(exec, value);
assertEquals(5L, value.getLastUpdated().getTime());
assertEquals(1, value.getStepExecutions().size());
}
/**
@@ -193,7 +192,6 @@ public abstract class AbstractJobExecutionDaoTests extends AbstractTransactional
JobExecution value = dao.getJobExecution(exec.getId());
assertEquals(exec, value);
assertEquals(1, value.getStepExecutions().size());
}
/**

View File

@@ -22,7 +22,7 @@ public abstract class AbstractJobInstanceDaoTests extends AbstractTransactionalJ
private static final long DATE = 777;
private JobInstanceDao dao = new MapJobInstanceDao();
protected JobInstanceDao dao = new MapJobInstanceDao();
private String fooJob = "foo";
@@ -149,5 +149,10 @@ public abstract class AbstractJobInstanceDaoTests extends AbstractTransactionalJ
assertNotNull(jobInstance.getVersion());
}
public void testGetJobInstanceByExecutionId(){
}
}

View File

@@ -1,7 +1,11 @@
package org.springframework.batch.core.repository.dao;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.junit.Assert;
import org.junit.runner.RunWith;
@@ -14,5 +18,16 @@ public class JdbcJobInstanceDaoTests extends AbstractJobInstanceDaoTests {
"BATCH_JOB_PARAMS", "BATCH_JOB_INSTANCE");
return (JobInstanceDao) applicationContext.getBean("jobInstanceDao");
}
public void testFindJobInstanceByExecution(){
JobExecutionDao jobExecutionDao = (JobExecutionDao) applicationContext.getBean("jobExecutionDao");
JobInstance jobInstance = dao.createJobInstance("testInstance", new JobParameters());
JobExecution jobExecution = new JobExecution(jobInstance, 2L);
jobExecutionDao.saveJobExecution(jobExecution);
JobInstance returnedInstance = dao.getJobInstance(jobExecution);
Assert.assertEquals(jobInstance, returnedInstance);
}
}

View File

@@ -140,9 +140,9 @@ public class JobRepositoryFactoryBeanTests {
expect(incrementerFactory.isSupportedIncrementerType("foo")).andReturn(true);
expect(incrementerFactory.getSupportedIncrementerTypes()).andReturn(new String[0]);
expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_SEQ")).andReturn(new StubIncrementer()).times(2);
expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_SEQ")).andReturn(new StubIncrementer());
expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_EXECUTION_SEQ")).andReturn(new StubIncrementer());
expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "STEP_EXECUTION_SEQ")).andReturn(new StubIncrementer()).times(2);
expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "STEP_EXECUTION_SEQ")).andReturn(new StubIncrementer());
replay(incrementerFactory);
factory.afterPropertiesSet();

View File

@@ -118,7 +118,7 @@ public class SimpleJobRepositoryTests {
public void testSaveOrUpdateInvalidJobExecution() {
// failure scenario - must have job ID
JobExecution jobExecution = new JobExecution(null);
JobExecution jobExecution = new JobExecution(null, null);
try {
jobRepository.update(jobExecution);
fail();

View File

@@ -23,8 +23,6 @@
<bean id="jobExecutionDao" class="org.springframework.batch.core.repository.dao.JdbcJobExecutionDao">
<property name="jdbcTemplate" ref="jdbcTemplate" />
<property name="jobExecutionIncrementer" ref="jobExecutionIncrementer" />
<property name="jobInstanceDao" ref="jobInstanceDao" />
<property name="stepExecutionDao" ref="stepExecutionDao" />
</bean>
<bean id="stepExecutionDao" class="org.springframework.batch.core.repository.dao.JdbcStepExecutionDao">