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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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()}.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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)));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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(){
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user