OPEN - issue BATCH-90: StepExecution and StepExecutionContext are parallel domains, and StepExecution is by comparison anaemic
http://opensource.atlassian.com/projects/spring/browse/BATCH-90 Remove *ExecutionContext by merging with *Execution
This commit is contained in:
@@ -23,7 +23,6 @@ import javax.management.Notification;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.batch.core.configuration.NoSuchJobConfigurationException;
|
||||
import org.springframework.batch.core.runtime.JobExecutionContext;
|
||||
import org.springframework.batch.core.runtime.JobIdentifier;
|
||||
import org.springframework.batch.execution.facade.JobExecutorFacade;
|
||||
import org.springframework.batch.execution.facade.NoSuchJobExecutionException;
|
||||
|
||||
@@ -22,10 +22,10 @@ import java.util.Properties;
|
||||
import org.springframework.batch.core.configuration.JobConfiguration;
|
||||
import org.springframework.batch.core.configuration.JobConfigurationLocator;
|
||||
import org.springframework.batch.core.configuration.NoSuchJobConfigurationException;
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.executor.JobExecutor;
|
||||
import org.springframework.batch.core.repository.JobRepository;
|
||||
import org.springframework.batch.core.runtime.JobExecutionContext;
|
||||
import org.springframework.batch.core.runtime.JobExecutionRegistry;
|
||||
import org.springframework.batch.core.runtime.JobIdentifier;
|
||||
import org.springframework.batch.execution.job.DefaultJobExecutor;
|
||||
@@ -127,7 +127,7 @@ public class SimpleJobExecutorFacade implements JobExecutorFacade, StatisticsPro
|
||||
.getJobConfiguration(jobRuntimeInformation.getName());
|
||||
|
||||
final JobInstance job = jobRepository.findOrCreateJob(jobConfiguration, jobRuntimeInformation);
|
||||
JobExecutionContext jobExecutionContext = jobExecutionRegistry.register(job);
|
||||
JobExecution jobExecutionContext = jobExecutionRegistry.register(job);
|
||||
|
||||
ExitStatus exitStatus = ExitStatus.FAILED;
|
||||
try {
|
||||
@@ -153,7 +153,7 @@ public class SimpleJobExecutorFacade implements JobExecutorFacade, StatisticsPro
|
||||
* @see org.springframework.batch.container.BatchContainer#stop(org.springframework.batch.container.common.runtime.JobRuntimeInformation)
|
||||
*/
|
||||
public void stop(JobIdentifier runtimeInformation) throws NoSuchJobExecutionException {
|
||||
JobExecutionContext jobExecutionContext = (JobExecutionContext) jobExecutionRegistry.get(runtimeInformation);
|
||||
JobExecution jobExecutionContext = jobExecutionRegistry.get(runtimeInformation);
|
||||
if (jobExecutionContext == null) {
|
||||
throw new NoSuchJobExecutionException("No such Job is executing: [" + runtimeInformation + "]");
|
||||
}
|
||||
@@ -193,7 +193,7 @@ public class SimpleJobExecutorFacade implements JobExecutorFacade, StatisticsPro
|
||||
int i = 0;
|
||||
Properties props = new Properties();
|
||||
for (Iterator iter = jobExecutionRegistry.findAll().iterator(); iter.hasNext();) {
|
||||
JobExecutionContext element = (JobExecutionContext) iter.next();
|
||||
JobExecution element = (JobExecution) iter.next();
|
||||
i++;
|
||||
String runtime = "job" + i;
|
||||
props.setProperty(runtime, "" + element.getJobIdentifier());
|
||||
|
||||
@@ -22,8 +22,8 @@ import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.runtime.JobExecutionContext;
|
||||
import org.springframework.batch.core.runtime.JobExecutionRegistry;
|
||||
import org.springframework.batch.core.runtime.JobIdentifier;
|
||||
|
||||
@@ -74,10 +74,10 @@ public class VolatileJobExecutionRegistry implements JobExecutionRegistry {
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.batch.container.common.executor.JobExecutionRegistry#findByRuntimeInformation(org.springframework.batch.container.common.runtime.JobRuntimeInformation)
|
||||
*/
|
||||
public JobExecutionContext get(JobIdentifier runtimeInformation) {
|
||||
public JobExecution get(JobIdentifier runtimeInformation) {
|
||||
|
||||
synchronized (this.contexts) {
|
||||
return (JobExecutionContext) contexts.get(runtimeInformation);
|
||||
return (JobExecution) contexts.get(runtimeInformation);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -98,14 +98,14 @@ public class VolatileJobExecutionRegistry implements JobExecutionRegistry {
|
||||
* @see org.springframework.batch.container.common.executor.JobExecutionRegistry#register(org.springframework.batch.container.common.runtime.JobRuntimeInformation,
|
||||
* org.springframework.batch.container.common.domain.JobExecution)
|
||||
*/
|
||||
public JobExecutionContext register(JobInstance job) {
|
||||
public JobExecution register(JobInstance job) {
|
||||
|
||||
JobIdentifier jobIdentifier = job.getIdentifier();
|
||||
|
||||
if (isRegistered(jobIdentifier)) {
|
||||
return get(jobIdentifier);
|
||||
}
|
||||
JobExecutionContext context = new JobExecutionContext(jobIdentifier, job);
|
||||
JobExecution context = new JobExecution(job);
|
||||
|
||||
synchronized (this.contexts) {
|
||||
contexts.put(jobIdentifier, context);
|
||||
|
||||
@@ -25,6 +25,7 @@ import org.springframework.batch.core.configuration.StepConfiguration;
|
||||
import org.springframework.batch.core.domain.BatchStatus;
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.StepExecution;
|
||||
import org.springframework.batch.core.domain.StepInstance;
|
||||
import org.springframework.batch.core.executor.ExitCodeExceptionClassifier;
|
||||
import org.springframework.batch.core.executor.JobExecutor;
|
||||
@@ -32,8 +33,6 @@ import org.springframework.batch.core.executor.StepExecutor;
|
||||
import org.springframework.batch.core.executor.StepExecutorFactory;
|
||||
import org.springframework.batch.core.executor.StepInterruptedException;
|
||||
import org.springframework.batch.core.repository.JobRepository;
|
||||
import org.springframework.batch.core.runtime.JobExecutionContext;
|
||||
import org.springframework.batch.core.runtime.StepExecutionContext;
|
||||
import org.springframework.batch.execution.step.SimpleStepExecutorFactory;
|
||||
import org.springframework.batch.execution.step.simple.SimpleExitCodeExceptionClassifier;
|
||||
import org.springframework.batch.io.exception.BatchCriticalException;
|
||||
@@ -57,12 +56,11 @@ public class DefaultJobExecutor implements JobExecutor {
|
||||
|
||||
private ExitCodeExceptionClassifier exceptionClassifier = new SimpleExitCodeExceptionClassifier();
|
||||
|
||||
public ExitStatus run(JobConfiguration configuration, JobExecutionContext jobExecutionContext)
|
||||
public ExitStatus run(JobConfiguration configuration, JobExecution jobExecution)
|
||||
throws BatchCriticalException {
|
||||
|
||||
JobInstance job = jobExecutionContext.getJob();
|
||||
JobExecution jobExecution = jobExecutionContext.getJobExecution();
|
||||
updateStatus(jobExecutionContext, BatchStatus.STARTING);
|
||||
JobInstance job = jobExecution.getJob();
|
||||
updateStatus(jobExecution, BatchStatus.STARTING);
|
||||
|
||||
List steps = job.getSteps();
|
||||
|
||||
@@ -74,22 +72,22 @@ public class DefaultJobExecutor implements JobExecutor {
|
||||
StepInstance step = (StepInstance) i.next();
|
||||
StepConfiguration stepConfiguration = (StepConfiguration) j.next();
|
||||
if (shouldStart(step, stepConfiguration)) {
|
||||
updateStatus(jobExecutionContext, BatchStatus.STARTED);
|
||||
updateStatus(jobExecution, BatchStatus.STARTED);
|
||||
StepExecutor stepExecutor = stepExecutorFactory.getExecutor(stepConfiguration);
|
||||
StepExecutionContext stepExecutionContext = new StepExecutionContext(jobExecutionContext, step);
|
||||
status = stepExecutor.process(stepConfiguration, stepExecutionContext);
|
||||
StepExecution stepExecution = new StepExecution(step, jobExecution);
|
||||
status = stepExecutor.process(stepConfiguration, stepExecution);
|
||||
}
|
||||
}
|
||||
|
||||
updateStatus(jobExecutionContext, BatchStatus.COMPLETED);
|
||||
updateStatus(jobExecution, BatchStatus.COMPLETED);
|
||||
}
|
||||
catch (StepInterruptedException e) {
|
||||
updateStatus(jobExecutionContext, BatchStatus.STOPPED);
|
||||
updateStatus(jobExecution, BatchStatus.STOPPED);
|
||||
status = exceptionClassifier.classifyForExitCode(e);
|
||||
rethrow(e);
|
||||
}
|
||||
catch (Throwable t) {
|
||||
updateStatus(jobExecutionContext, BatchStatus.FAILED);
|
||||
updateStatus(jobExecution, BatchStatus.FAILED);
|
||||
status = exceptionClassifier.classifyForExitCode(t);
|
||||
rethrow(t);
|
||||
}
|
||||
@@ -102,14 +100,13 @@ public class DefaultJobExecutor implements JobExecutor {
|
||||
return status;
|
||||
}
|
||||
|
||||
private void updateStatus(JobExecutionContext jobExecutionContext, BatchStatus status) {
|
||||
JobInstance job = jobExecutionContext.getJob();
|
||||
JobExecution jobExecution = jobExecutionContext.getJobExecution();
|
||||
private void updateStatus(JobExecution jobExecution, BatchStatus status) {
|
||||
JobInstance job = jobExecution.getJob();
|
||||
jobExecution.setStatus(status);
|
||||
job.setStatus(status);
|
||||
jobRepository.update(job);
|
||||
jobRepository.saveOrUpdate(jobExecution);
|
||||
for (Iterator iter = jobExecutionContext.getStepContexts().iterator(); iter.hasNext();) {
|
||||
for (Iterator iter = jobExecution.getStepContexts().iterator(); iter.hasNext();) {
|
||||
RepeatContext context = (RepeatContext) iter.next();
|
||||
context.setAttribute("JOB_STATUS", status);
|
||||
}
|
||||
|
||||
@@ -30,10 +30,11 @@ import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* It represents an implementation of {@link StepDao} functionality based
|
||||
* on the Hibernate ORM framework. Its advantage is the independency of implementation
|
||||
* on the Hibernate ORM framework. Its advantage is the independence of implementation
|
||||
* on the underlying database.
|
||||
*
|
||||
* @author tomas.slanina
|
||||
* @author Tomas Slanina
|
||||
* @author Dave Syer
|
||||
*/
|
||||
public class HibernateStepDao extends HibernateDaoSupport implements StepDao {
|
||||
|
||||
@@ -45,9 +46,7 @@ public class HibernateStepDao extends HibernateDaoSupport implements StepDao {
|
||||
Assert.notNull(job, "Job cannot be null.");
|
||||
Assert.notNull(stepName, "StepName cannot be null.");
|
||||
|
||||
StepInstance step = new StepInstance();
|
||||
step.setName(stepName);
|
||||
step.setJob(job);
|
||||
StepInstance step = new StepInstance(job, stepName);
|
||||
|
||||
Long stepId = (Long)getHibernateTemplate().save(step);
|
||||
|
||||
@@ -78,20 +77,20 @@ public class HibernateStepDao extends HibernateDaoSupport implements StepDao {
|
||||
}
|
||||
|
||||
/**
|
||||
* @see StepDao#findSteps(Long)
|
||||
* @see StepDao#findSteps(JobInstance)
|
||||
*
|
||||
* Hibernate is asked to get all jobs that matches criteria. Afterwards, result is mapped into domain objects.
|
||||
* It should be noted that restart data must be requested separately.
|
||||
*
|
||||
*/
|
||||
public List findSteps(final Long jobId) {
|
||||
public List findSteps(final JobInstance job) {
|
||||
|
||||
Assert.notNull(jobId, "JobId cannot be null.");
|
||||
Assert.notNull(job, "JobId cannot be null.");
|
||||
|
||||
List list = this.getHibernateTemplate().executeFind(new HibernateCallback() {
|
||||
public Object doInHibernate(Session session) {
|
||||
Criteria criteria = session.createCriteria(StepInstance.class);
|
||||
criteria.add(Expression.eq("job.id", jobId));
|
||||
criteria.add(Expression.eq("job.id", job.getId()));
|
||||
return criteria.list();
|
||||
}
|
||||
});
|
||||
@@ -105,7 +104,7 @@ public class HibernateStepDao extends HibernateDaoSupport implements StepDao {
|
||||
public int getStepExecutionCount(final Long stepId) {
|
||||
Long result = (Long) this.getHibernateTemplate().execute(new HibernateCallback() {
|
||||
public Object doInHibernate(Session session) {
|
||||
return session.createQuery("select count(id) from StepExecution s where s.stepId = :stepId")
|
||||
return session.createQuery("select count(id) from StepExecution s where s.step.id = :stepId")
|
||||
.setLong("stepId", stepId.longValue())
|
||||
.uniqueResult();
|
||||
}
|
||||
@@ -151,17 +150,14 @@ public class HibernateStepDao extends HibernateDaoSupport implements StepDao {
|
||||
getHibernateTemplate().update(stepExecution);
|
||||
}
|
||||
|
||||
public List findStepExecutions(StepInstance step) {
|
||||
public List findStepExecutions(final StepInstance step) {
|
||||
|
||||
Assert.notNull(step, "Step cannot be null.");
|
||||
Assert.notNull(step.getId(), "Step id cannot be null.");
|
||||
|
||||
final Long stepId = step.getId();
|
||||
|
||||
|
||||
List results = this.getHibernateTemplate().executeFind(new HibernateCallback() {
|
||||
public Object doInHibernate(Session session) {
|
||||
Criteria criteria = session.createCriteria(StepExecution.class);
|
||||
criteria.add(Expression.eq("stepId", stepId));
|
||||
criteria.add(Expression.eq("step.id", step.getId()));
|
||||
return criteria.list();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -48,9 +48,7 @@ public class MapStepDao implements StepDao {
|
||||
}
|
||||
|
||||
public StepInstance createStep(JobInstance job, String stepName) {
|
||||
StepInstance step = new StepInstance(new Long(currentId++));
|
||||
step.setName(stepName);
|
||||
step.setJob(job);
|
||||
StepInstance step = new StepInstance(job, stepName, new Long(currentId++));
|
||||
Set steps = (Set) stepsByJobId.get(job.getId());
|
||||
if (steps==null) {
|
||||
steps = TransactionAwareProxyFactory.createTransactionalSet();
|
||||
@@ -74,8 +72,8 @@ public class MapStepDao implements StepDao {
|
||||
return null;
|
||||
}
|
||||
|
||||
public List findSteps(Long jobId) {
|
||||
Set steps = (Set) stepsByJobId.get(jobId);
|
||||
public List findSteps(JobInstance job) {
|
||||
Set steps = (Set) stepsByJobId.get(job.getId());
|
||||
if (steps==null) {
|
||||
return new ArrayList();
|
||||
}
|
||||
|
||||
@@ -71,14 +71,11 @@ public class SqlJobDao implements JobDao, InitializingBean {
|
||||
private static final String UPDATE_JOB_EXECUTION = "UPDATE %PREFIX%JOB_EXECUTION set START_TIME = ?, END_TIME = ?, "
|
||||
+ " STATUS = ?, EXIT_CODE = ? where ID = ?";
|
||||
|
||||
private static final String SAVE_JOB_EXECUTION = "INSERT into %PREFIX%JOB_EXECUTION(ID, JOB_ID, START_TIME, " +
|
||||
"END_TIME, STATUS, EXIT_CODE) values (?, ?, ?, ?, ?, ?)";
|
||||
private static final String SAVE_JOB_EXECUTION = "INSERT into %PREFIX%JOB_EXECUTION(ID, JOB_ID, START_TIME, "
|
||||
+ "END_TIME, STATUS, EXIT_CODE) values (?, ?, ?, ?, ?, ?)";
|
||||
|
||||
private static final String CHECK_JOB_EXECUTION_EXISTS = "SELECT COUNT(*) FROM %PREFIX%JOB_EXECUTION WHERE ID=?";
|
||||
|
||||
private static final String FIND_JOB_EXECUTIONS = "SELECT ID, START_TIME, END_TIME, STATUS from %PREFIX%JOB_EXECUTION"
|
||||
+ " where JOB_ID = ?";
|
||||
|
||||
private JdbcTemplate jdbcTemplate;
|
||||
|
||||
private DataFieldMaxValueIncrementer jobIncrementer;
|
||||
@@ -144,7 +141,8 @@ public class SqlJobDao implements JobDao, InitializingBean {
|
||||
RowMapper rowMapper = new RowMapper() {
|
||||
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
|
||||
JobInstance job = new JobInstance(jobIdentifier, new Long(rs.getLong(1)));
|
||||
JobInstance job = new JobInstance(jobIdentifier, new Long(rs
|
||||
.getLong(1)));
|
||||
job.setStatus(BatchStatus.getStatus(rs.getString(2)));
|
||||
|
||||
return job;
|
||||
@@ -189,7 +187,7 @@ public class SqlJobDao implements JobDao, InitializingBean {
|
||||
Object[] parameters = new Object[] { jobExecution.getId(),
|
||||
jobExecution.getJobId(), jobExecution.getStartTime(),
|
||||
jobExecution.getEndTime(), jobExecution.getStatus().toString(),
|
||||
jobExecution.getExitCode()};
|
||||
jobExecution.getExitCode() };
|
||||
jdbcTemplate.update(getSaveJobExecutionQuery(), parameters);
|
||||
}
|
||||
|
||||
@@ -239,71 +237,51 @@ public class SqlJobDao implements JobDao, InitializingBean {
|
||||
|
||||
Object[] parameters = new Object[] { jobId };
|
||||
|
||||
return jdbcTemplate.queryForInt(getJobExecutionCountQuery(), parameters);
|
||||
return jdbcTemplate
|
||||
.queryForInt(getJobExecutionCountQuery(), parameters);
|
||||
}
|
||||
|
||||
public List findJobExecutions(JobInstance job) {
|
||||
public List findJobExecutions(final JobInstance job) {
|
||||
|
||||
Assert.notNull(job, "Job cannot be null.");
|
||||
Assert.notNull(job.getId(), "Job Id cannot be null.");
|
||||
|
||||
final Long jobId = job.getId();
|
||||
|
||||
RowMapper rowMapper = new RowMapper() {
|
||||
|
||||
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
|
||||
JobExecution jobExecution = new JobExecution(jobId);
|
||||
jobExecution.setId(new Long(rs.getLong(1)));
|
||||
jobExecution.setStartTime(rs.getTimestamp(2));
|
||||
jobExecution.setEndTime(rs.getTimestamp(3));
|
||||
jobExecution.setStatus(BatchStatus.getStatus(rs.getString(4)));
|
||||
|
||||
return jobExecution;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
return jdbcTemplate.query(getFindJobExecutionsQuery(), new Object[] { jobId },
|
||||
rowMapper);
|
||||
return jdbcTemplate.query(getQuery(JobExecutionRowMapper.FIND_JOB_EXECUTIONS),
|
||||
new Object[] { job.getId() }, new JobExecutionRowMapper(job));
|
||||
}
|
||||
|
||||
private String getQuery(String base) {
|
||||
return StringUtils.replace(base, "%PREFIX%", tablePrefix);
|
||||
}
|
||||
|
||||
|
||||
private String getCreateJobQuery() {
|
||||
return getQuery(CREATE_JOB);
|
||||
}
|
||||
|
||||
|
||||
private String getFindJobsQuery() {
|
||||
return getQuery(FIND_JOBS);
|
||||
}
|
||||
|
||||
|
||||
private String getUpdateJobQuery() {
|
||||
return getQuery(UPDATE_JOB);
|
||||
}
|
||||
|
||||
|
||||
private String getSaveJobExecutionQuery() {
|
||||
return getQuery(SAVE_JOB_EXECUTION);
|
||||
}
|
||||
|
||||
|
||||
private String getUpdateJobExecutionQuery() {
|
||||
return getQuery(UPDATE_JOB_EXECUTION);
|
||||
}
|
||||
|
||||
|
||||
private String getCheckJobExecutionExistsQuery() {
|
||||
return getQuery(CHECK_JOB_EXECUTION_EXISTS);
|
||||
}
|
||||
|
||||
|
||||
private String getJobExecutionCountQuery() {
|
||||
return getQuery(GET_JOB_EXECUTION_COUNT);
|
||||
}
|
||||
|
||||
private String getFindJobExecutionsQuery() {
|
||||
return getQuery(FIND_JOB_EXECUTIONS);
|
||||
}
|
||||
|
||||
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
|
||||
this.jdbcTemplate = jdbcTemplate;
|
||||
}
|
||||
@@ -386,4 +364,35 @@ public class SqlJobDao implements JobDao, InitializingBean {
|
||||
return new ScheduledJobIdentifier(jobIdentifier.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-usable mapper for {@link JobExecution} instances.
|
||||
* @author Dave Syer
|
||||
*
|
||||
*/
|
||||
public static class JobExecutionRowMapper implements RowMapper {
|
||||
|
||||
public static final String FIND_JOB_EXECUTIONS = "SELECT ID, START_TIME, END_TIME, STATUS from %PREFIX%JOB_EXECUTION"
|
||||
+ " where JOB_ID = ?";
|
||||
|
||||
public static final String GET_JOB_EXECUTION = "SELECT ID, START_TIME, END_TIME, STATUS from %PREFIX%JOB_EXECUTION"
|
||||
+ " where ID = ?";
|
||||
|
||||
private JobInstance job;
|
||||
|
||||
public JobExecutionRowMapper(JobInstance job) {
|
||||
super();
|
||||
this.job = job;
|
||||
}
|
||||
|
||||
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
JobExecution jobExecution = new JobExecution(job);
|
||||
jobExecution.setId(new Long(rs.getLong(1)));
|
||||
jobExecution.setStartTime(rs.getTimestamp(2));
|
||||
jobExecution.setEndTime(rs.getTimestamp(3));
|
||||
jobExecution.setStatus(BatchStatus.getStatus(rs.getString(4)));
|
||||
return jobExecution;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -22,10 +22,12 @@ import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.springframework.batch.core.domain.BatchStatus;
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.StepExecution;
|
||||
import org.springframework.batch.core.domain.StepInstance;
|
||||
import org.springframework.batch.core.repository.NoSuchBatchDomainObjectException;
|
||||
import org.springframework.batch.execution.repository.dao.SqlJobDao.JobExecutionRowMapper;
|
||||
import org.springframework.batch.restart.GenericRestartData;
|
||||
import org.springframework.batch.restart.RestartData;
|
||||
import org.springframework.batch.support.PropertiesConverter;
|
||||
@@ -37,7 +39,7 @@ import org.springframework.util.Assert;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* Sql implementation of StepDao. Uses Sequences (via Spring's
|
||||
* Sql implementation of {@link StepDao}. Uses Sequences (via Spring's
|
||||
*
|
||||
* @link DataFieldMaxValueIncrementer abstraction) to create all Step and
|
||||
* StepExecution primary keys before inserting a new row. All objects are
|
||||
@@ -82,6 +84,8 @@ public class SqlStepDao implements StepDao, InitializingBean {
|
||||
|
||||
private JdbcOperations jdbcTemplate;
|
||||
|
||||
private JobDao jobDao;
|
||||
|
||||
private DataFieldMaxValueIncrementer stepIncrementer;
|
||||
|
||||
private DataFieldMaxValueIncrementer stepExecutionIncrementer;
|
||||
@@ -100,6 +104,16 @@ public class SqlStepDao implements StepDao, InitializingBean {
|
||||
this.tablePrefix = tablePrefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection setter for job dao. Used to save {@link JobExecution}
|
||||
* instances.
|
||||
*
|
||||
* @param jobDao a {@link JobDao}
|
||||
*/
|
||||
public void setJobDao(JobDao jobDao) {
|
||||
this.jobDao = jobDao;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find one step for given job and stepName. A RowMapper is used to map each
|
||||
* row returned to a step object. If none are found, the list will be empty
|
||||
@@ -141,7 +155,6 @@ public class SqlStepDao implements StepDao, InitializingBean {
|
||||
return null;
|
||||
} else if (steps.size() == 1) {
|
||||
StepInstance step = (StepInstance) steps.get(0);
|
||||
step.setName(stepName);
|
||||
return step;
|
||||
} else {
|
||||
// This error will likely never be thrown, because there should
|
||||
@@ -155,7 +168,7 @@ public class SqlStepDao implements StepDao, InitializingBean {
|
||||
}
|
||||
|
||||
/**
|
||||
* @see StepDao#findSteps(Long)
|
||||
* @see StepDao#findSteps(JobInstance)
|
||||
*
|
||||
* Sql implementation which uses a RowMapper to populate a list of all rows
|
||||
* in the step table with the same JOB_ID.
|
||||
@@ -163,18 +176,18 @@ public class SqlStepDao implements StepDao, InitializingBean {
|
||||
* @throws IllegalArgumentException
|
||||
* if jobId is null.
|
||||
*/
|
||||
public List findSteps(Long jobId) {
|
||||
public List findSteps(final JobInstance job) {
|
||||
|
||||
Assert.notNull(jobId, "JobId cannot be null.");
|
||||
Assert.notNull(job, "Job cannot be null.");
|
||||
|
||||
Object[] parameters = new Object[] { jobId };
|
||||
Object[] parameters = new Object[] { job.getId() };
|
||||
|
||||
RowMapper rowMapper = new RowMapper() {
|
||||
|
||||
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
|
||||
StepInstance step = new StepInstance(new Long(rs.getLong(1)));
|
||||
step.setName(rs.getString(2));
|
||||
StepInstance step = new StepInstance(job, rs.getString(2),
|
||||
new Long(rs.getLong(1)));
|
||||
String status = rs.getString(3);
|
||||
step.setStatus(BatchStatus.getStatus(status));
|
||||
step.setRestartData(new GenericRestartData(PropertiesConverter
|
||||
@@ -204,9 +217,7 @@ public class SqlStepDao implements StepDao, InitializingBean {
|
||||
Object[] parameters = new Object[] { stepId, job.getId(), stepName };
|
||||
jdbcTemplate.update(getQuery(CREATE_STEP), parameters);
|
||||
|
||||
StepInstance step = new StepInstance(stepId);
|
||||
step.setJob(job);
|
||||
step.setName(stepName);
|
||||
StepInstance step = new StepInstance(job, stepName, stepId);
|
||||
return step;
|
||||
}
|
||||
|
||||
@@ -245,6 +256,8 @@ public class SqlStepDao implements StepDao, InitializingBean {
|
||||
|
||||
validateStepExecution(stepExecution);
|
||||
|
||||
cascadeJobExecution(stepExecution.getJobExecution());
|
||||
|
||||
stepExecution.setId(new Long(stepExecutionIncrementer.nextLongValue()));
|
||||
Object[] parameters = new Object[] {
|
||||
stepExecution.getId(),
|
||||
@@ -263,6 +276,14 @@ public class SqlStepDao implements StepDao, InitializingBean {
|
||||
|
||||
}
|
||||
|
||||
private void cascadeJobExecution(JobExecution jobExecution) {
|
||||
if (jobExecution.getId() != null) {
|
||||
// assume already saved...
|
||||
return;
|
||||
}
|
||||
jobDao.save(jobExecution);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see StepDao#update(StepExecution)
|
||||
*/
|
||||
@@ -289,8 +310,7 @@ public class SqlStepDao implements StepDao, InitializingBean {
|
||||
stepExecution.getTaskCount(),
|
||||
PropertiesConverter.propertiesToString(stepExecution
|
||||
.getStatistics()), stepExecution.getExitCode(),
|
||||
stepExecution.getExitDescription(),
|
||||
stepExecution.getId() };
|
||||
stepExecution.getExitDescription(), stepExecution.getId() };
|
||||
jdbcTemplate.update(getQuery(UPDATE_STEP_EXECUTION), parameters);
|
||||
|
||||
}
|
||||
@@ -313,19 +333,21 @@ public class SqlStepDao implements StepDao, InitializingBean {
|
||||
* @throws NoSuchBatchDomainObjectException
|
||||
* if more than one step execution is returned.
|
||||
*/
|
||||
public List findStepExecutions(StepInstance step) {
|
||||
public List findStepExecutions(final StepInstance step) {
|
||||
|
||||
Assert.notNull(step, "Step cannot be null.");
|
||||
Assert.notNull(step.getId(), "Step id cannot be null.");
|
||||
|
||||
final Long stepId = step.getId();
|
||||
|
||||
RowMapper rowMapper = new RowMapper() {
|
||||
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
|
||||
StepExecution stepExecution = new StepExecution(stepId,
|
||||
new Long(rs.getLong(2)));
|
||||
stepExecution.setId(new Long(rs.getLong(1)));
|
||||
JobExecution jobExecution = (JobExecution) jdbcTemplate
|
||||
.queryForObject(
|
||||
getQuery(JobExecutionRowMapper.GET_JOB_EXECUTION),
|
||||
new Object[] { new Long(rs.getLong(2)) },
|
||||
new JobExecutionRowMapper(step.getJob()));
|
||||
StepExecution stepExecution = new StepExecution(step,
|
||||
jobExecution, new Long(rs.getLong(1)));
|
||||
stepExecution.setStartTime(rs.getTimestamp(3));
|
||||
stepExecution.setEndTime(rs.getTimestamp(4));
|
||||
stepExecution.setStatus(BatchStatus.getStatus(rs.getString(5)));
|
||||
@@ -340,7 +362,7 @@ public class SqlStepDao implements StepDao, InitializingBean {
|
||||
};
|
||||
|
||||
return jdbcTemplate.query(getQuery(FIND_STEP_EXECUTIONS),
|
||||
new Object[] { stepId }, rowMapper);
|
||||
new Object[] { step.getId() }, rowMapper);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -28,13 +28,13 @@ import org.springframework.batch.core.domain.StepInstance;
|
||||
* TODO: Add java doc.
|
||||
*
|
||||
* @author Lucas Ward
|
||||
*
|
||||
*
|
||||
*/
|
||||
public interface StepDao {
|
||||
|
||||
/**
|
||||
* Find a step with the given JobId and Step Name. Return null if none
|
||||
* are found.
|
||||
* Find a step with the given JobId and Step Name. Return null if none are
|
||||
* found.
|
||||
*
|
||||
* @param jobId
|
||||
* @param stepName
|
||||
@@ -43,15 +43,17 @@ public interface StepDao {
|
||||
public StepInstance findStep(JobInstance job, String stepName);
|
||||
|
||||
/**
|
||||
* Find all steps with the given Job ID.
|
||||
* Find all steps with the given Job.
|
||||
*
|
||||
* @param jobId
|
||||
* @return
|
||||
* @param job
|
||||
* the job to use as a search key
|
||||
* @return list of {@link StepInstance}
|
||||
*/
|
||||
public List findSteps(Long jobId);
|
||||
public List findSteps(JobInstance job);
|
||||
|
||||
/**
|
||||
* Create a step for the given Step Name and Job Id.
|
||||
*
|
||||
* @param job
|
||||
* @param stepName
|
||||
*
|
||||
@@ -91,15 +93,17 @@ public interface StepDao {
|
||||
* Return the count of StepExecutions with the given StepId.
|
||||
*
|
||||
* @param stepId
|
||||
* @return
|
||||
* @return the number of step executions for this step TODO: change
|
||||
* signature to search by {@link StepInstance}
|
||||
*/
|
||||
public int getStepExecutionCount(Long stepId);
|
||||
|
||||
|
||||
/**
|
||||
* Return all StepExecutions for the given step.
|
||||
* Return all StepExecutions for the given step.
|
||||
*
|
||||
* @param id
|
||||
* @return list of stepExecutions
|
||||
* @param step
|
||||
* the step to use as a search key
|
||||
* @return list of stepExecutions
|
||||
*/
|
||||
public List findStepExecutions(StepInstance step);
|
||||
}
|
||||
|
||||
@@ -28,11 +28,9 @@ import org.springframework.batch.core.executor.ExitCodeExceptionClassifier;
|
||||
import org.springframework.batch.core.executor.StepExecutor;
|
||||
import org.springframework.batch.core.executor.StepInterruptedException;
|
||||
import org.springframework.batch.core.repository.JobRepository;
|
||||
import org.springframework.batch.core.runtime.JobExecutionContext;
|
||||
import org.springframework.batch.core.runtime.StepExecutionContext;
|
||||
import org.springframework.batch.core.tasklet.Tasklet;
|
||||
import org.springframework.batch.execution.scope.StepScope;
|
||||
import org.springframework.batch.execution.scope.SimpleStepContext;
|
||||
import org.springframework.batch.execution.scope.StepScope;
|
||||
import org.springframework.batch.execution.scope.StepSynchronizationManager;
|
||||
import org.springframework.batch.io.exception.BatchCriticalException;
|
||||
import org.springframework.batch.repeat.ExitStatus;
|
||||
@@ -75,7 +73,7 @@ public class SimpleStepExecutor implements StepExecutor {
|
||||
|
||||
/**
|
||||
* Key placed in step scope context to identify the
|
||||
* {@link StepExecutionContext}.
|
||||
* {@link StepExecution}.
|
||||
*/
|
||||
public static final String STEP_KEY = "STEP";
|
||||
|
||||
@@ -149,16 +147,15 @@ public class SimpleStepExecutor implements StepExecutor {
|
||||
* @throws StepInterruptedException if the step or a chunk is interrupted
|
||||
* @throws RuntimeException if there is an exception during a chunk
|
||||
* execution
|
||||
* @see StepExecutor#process(StepConfiguration, StepExecutionContext)
|
||||
* @see StepExecutor#process(StepConfiguration, StepExecution)
|
||||
*/
|
||||
public ExitStatus process(final StepConfiguration configuration, final StepExecutionContext stepExecutionContext)
|
||||
public ExitStatus process(final StepConfiguration configuration, final StepExecution stepExecution)
|
||||
throws BatchCriticalException, StepInterruptedException {
|
||||
|
||||
final StepInstance step = stepExecutionContext.getStep();
|
||||
final StepInstance step = stepExecution.getStep();
|
||||
boolean isRestart = step.getStepExecutionCount() > 0 ? true : false;
|
||||
Assert.notNull(step);
|
||||
|
||||
final StepExecution stepExecution = stepExecutionContext.getStepExecution();
|
||||
final Tasklet module = configuration.getTasklet();
|
||||
step.setStepExecution(stepExecution);
|
||||
|
||||
@@ -168,7 +165,7 @@ public class SimpleStepExecutor implements StepExecutor {
|
||||
|
||||
try {
|
||||
stepExecution.setStartTime(new Timestamp(System.currentTimeMillis()));
|
||||
updateStatus(stepExecutionContext, BatchStatus.STARTED);
|
||||
updateStatus(stepExecution, BatchStatus.STARTED);
|
||||
|
||||
final boolean saveRestartData = ((AbstractStepConfiguration) configuration).isSaveRestartData();
|
||||
|
||||
@@ -180,18 +177,18 @@ public class SimpleStepExecutor implements StepExecutor {
|
||||
|
||||
public ExitStatus doInIteration(final RepeatContext context) throws Exception {
|
||||
|
||||
stepExecutionContext.getJobExecutionContext().registerStepContext(context);
|
||||
stepExecution.getJobExecution().registerStepContext(context);
|
||||
context.registerDestructionCallback("STEP_EXECUTION_CONTEXT_CALLBACK", new Runnable() {
|
||||
public void run() {
|
||||
stepExecutionContext.getJobExecutionContext().unregisterStepContext(context);
|
||||
stepExecution.getJobExecution().unregisterStepContext(context);
|
||||
}
|
||||
});
|
||||
stepScopeContext.setJobIdentifier(stepExecutionContext.getJobExecutionContext().getJobIdentifier());
|
||||
context.setAttribute(StepScope.ID_KEY, stepExecutionContext.getJobExecutionContext()
|
||||
stepScopeContext.setJobIdentifier(stepExecution.getJobExecution().getJobIdentifier());
|
||||
context.setAttribute(StepScope.ID_KEY, stepExecution.getJobExecution()
|
||||
.getJobIdentifier());
|
||||
// Mark the context as a step context as a hint to scope
|
||||
// implementations.
|
||||
context.setAttribute(STEP_KEY, stepExecutionContext);
|
||||
context.setAttribute(STEP_KEY, stepExecution);
|
||||
// Add the step execution as an attribute so monitoring
|
||||
// clients can see it.
|
||||
context.setAttribute(STEP_EXECUTION_KEY, stepExecution);
|
||||
@@ -208,7 +205,7 @@ public class SimpleStepExecutor implements StepExecutor {
|
||||
ExitStatus result;
|
||||
|
||||
try {
|
||||
result = processChunk(configuration, stepExecutionContext);
|
||||
result = processChunk(configuration, stepExecution);
|
||||
}
|
||||
catch (Throwable t) {
|
||||
/*
|
||||
@@ -250,7 +247,7 @@ public class SimpleStepExecutor implements StepExecutor {
|
||||
|
||||
});
|
||||
|
||||
updateStatus(stepExecutionContext, BatchStatus.COMPLETED);
|
||||
updateStatus(stepExecution, BatchStatus.COMPLETED);
|
||||
return status;
|
||||
}
|
||||
catch (RuntimeException e) {
|
||||
@@ -259,11 +256,11 @@ public class SimpleStepExecutor implements StepExecutor {
|
||||
status = exceptionClassifier.classifyForExitCode(e);
|
||||
stepExecution.setException(e);
|
||||
if (e.getCause() instanceof StepInterruptedException) {
|
||||
updateStatus(stepExecutionContext, BatchStatus.STOPPED);
|
||||
updateStatus(stepExecution, BatchStatus.STOPPED);
|
||||
throw (StepInterruptedException) e.getCause();
|
||||
}
|
||||
else {
|
||||
updateStatus(stepExecutionContext, BatchStatus.FAILED);
|
||||
updateStatus(stepExecution, BatchStatus.FAILED);
|
||||
throw e;
|
||||
}
|
||||
|
||||
@@ -294,14 +291,13 @@ public class SimpleStepExecutor implements StepExecutor {
|
||||
* @param stepExecution the current stepExecution
|
||||
* @param status the status to set
|
||||
*/
|
||||
private void updateStatus(StepExecutionContext stepExecutionContext, BatchStatus status) {
|
||||
StepInstance step = stepExecutionContext.getStep();
|
||||
StepExecution stepExecution = stepExecutionContext.getStepExecution();
|
||||
private void updateStatus(StepExecution stepExecution, BatchStatus status) {
|
||||
StepInstance step = stepExecution.getStep();
|
||||
stepExecution.setStatus(status);
|
||||
step.setStatus(status);
|
||||
jobRepository.update(step);
|
||||
jobRepository.saveOrUpdate(stepExecution);
|
||||
for (Iterator iter = stepExecutionContext.getJobExecutionContext().getStepContexts().iterator(); iter.hasNext();) {
|
||||
for (Iterator iter = stepExecution.getJobExecution().getStepContexts().iterator(); iter.hasNext();) {
|
||||
RepeatContext context = (RepeatContext) iter.next();
|
||||
context.setAttribute("JOB_STATUS", status);
|
||||
}
|
||||
@@ -314,24 +310,24 @@ public class SimpleStepExecutor implements StepExecutor {
|
||||
* transaction.
|
||||
*
|
||||
* @param configuration the current step configuration
|
||||
* @param stepExecutionContext the current step, containing the
|
||||
* @param stepExecution the current step, containing the
|
||||
* {@link Tasklet} with the business logic.
|
||||
* @return true if there is more data to process.
|
||||
*/
|
||||
protected final ExitStatus processChunk(final StepConfiguration configuration,
|
||||
final StepExecutionContext stepExecutionContext) {
|
||||
final StepExecution stepExecution) {
|
||||
return chunkOperations.iterate(new RepeatCallback() {
|
||||
public ExitStatus doInIteration(final RepeatContext context) throws Exception {
|
||||
stepExecutionContext.getJobExecutionContext().registerChunkContext(context);
|
||||
stepExecution.getJobExecution().registerChunkContext(context);
|
||||
context.registerDestructionCallback("CHUNK_EXECUTION_CONTEXT_CALLBACK", new Runnable() {
|
||||
public void run() {
|
||||
stepExecutionContext.getJobExecutionContext().unregisterStepContext(context);
|
||||
stepExecution.getJobExecution().unregisterStepContext(context);
|
||||
}
|
||||
});
|
||||
// check for interruption before each item as well
|
||||
interruptionPolicy.checkInterrupted(context);
|
||||
ExitStatus exitStatus = doTaskletProcessing(configuration.getTasklet(), stepExecutionContext.getStep());
|
||||
stepExecutionContext.getStepExecution().incrementTaskCount();
|
||||
ExitStatus exitStatus = doTaskletProcessing(configuration.getTasklet(), stepExecution.getStep());
|
||||
stepExecution.incrementTaskCount();
|
||||
// check for interruption after each item as well
|
||||
interruptionPolicy.checkInterrupted(context);
|
||||
return exitStatus;
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
&step-execution-generator;
|
||||
</id>
|
||||
<version name="version" access="field"/>
|
||||
<property name="stepId" type="long" update="false" column="STEP_ID" access="field"/>
|
||||
<property name="jobExecutionId" type="long" update="false" column="JOB_EXECUTION_ID" access="field"/>
|
||||
<many-to-one name="step" update="false" column="STEP_ID" access="field"/>
|
||||
<many-to-one name="jobExecution" cascade="save-update" update="false" column="JOB_EXECUTION_ID" access="field"/>
|
||||
<property name="startTime" column="START_TIME" />
|
||||
<property name="endTime" column="END_TIME" />
|
||||
<property name="status" type="org.springframework.batch.execution.repository.dao.BatchStatusUserType" column="STATUS" />
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
&step-generator;
|
||||
</id>
|
||||
<version name="version" access="field"/>
|
||||
<many-to-one name="job" update="false" column="JOB_ID" />
|
||||
<property name="name" update="false" column="STEP_NAME" />
|
||||
<many-to-one name="job" update="false" column="JOB_ID" access="field"/>
|
||||
<property name="name" update="false" column="STEP_NAME" access="field"/>
|
||||
<property name="restartData"
|
||||
type="org.springframework.batch.execution.repository.dao.RestartDataUserType" insert="false"
|
||||
column="RESTART_DATA" />
|
||||
|
||||
@@ -26,14 +26,14 @@ import org.springframework.batch.core.configuration.JobConfiguration;
|
||||
import org.springframework.batch.core.configuration.JobConfigurationLocator;
|
||||
import org.springframework.batch.core.configuration.NoSuchJobConfigurationException;
|
||||
import org.springframework.batch.core.configuration.StepConfiguration;
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.StepExecution;
|
||||
import org.springframework.batch.core.executor.JobExecutor;
|
||||
import org.springframework.batch.core.executor.StepExecutor;
|
||||
import org.springframework.batch.core.repository.JobRepository;
|
||||
import org.springframework.batch.core.runtime.JobExecutionContext;
|
||||
import org.springframework.batch.core.runtime.JobExecutionRegistry;
|
||||
import org.springframework.batch.core.runtime.SimpleJobIdentifier;
|
||||
import org.springframework.batch.core.runtime.StepExecutionContext;
|
||||
import org.springframework.batch.io.exception.BatchCriticalException;
|
||||
import org.springframework.batch.repeat.ExitStatus;
|
||||
import org.springframework.batch.repeat.context.RepeatContextSupport;
|
||||
@@ -59,7 +59,7 @@ public class SimpleJobExecutorFacaderTests extends TestCase {
|
||||
JobConfiguration jobConfiguration = new JobConfiguration();
|
||||
|
||||
StepExecutor stepExecutor = new StepExecutor() {
|
||||
public ExitStatus process(StepConfiguration configuration, StepExecutionContext stepExecutionContext) throws BatchCriticalException {
|
||||
public ExitStatus process(StepConfiguration configuration, StepExecution stepExecution) throws BatchCriticalException {
|
||||
return ExitStatus.FINISHED;
|
||||
}
|
||||
};
|
||||
@@ -79,12 +79,12 @@ public class SimpleJobExecutorFacaderTests extends TestCase {
|
||||
final SimpleJobIdentifier jobRuntimeInformation = new SimpleJobIdentifier("bar");
|
||||
jobRepository.findOrCreateJob(jobConfiguration, jobRuntimeInformation);
|
||||
jobExecutor = new JobExecutor() {
|
||||
public ExitStatus run(JobConfiguration configuration, JobExecutionContext jobExecutionContext) throws BatchCriticalException {
|
||||
public ExitStatus run(JobConfiguration configuration, JobExecution jobExecutionContext) throws BatchCriticalException {
|
||||
return ExitStatus.FINISHED;
|
||||
}
|
||||
};
|
||||
JobInstance job = new JobInstance(jobRuntimeInformation);
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(jobRuntimeInformation, job);
|
||||
JobExecution jobExecutionContext = new JobExecution(job);
|
||||
jobRepositoryControl.setReturnValue(job);
|
||||
jobExecutor.run(jobConfiguration, jobExecutionContext);
|
||||
jobRepositoryControl.replay();
|
||||
@@ -103,7 +103,7 @@ public class SimpleJobExecutorFacaderTests extends TestCase {
|
||||
|
||||
public void testIsRunning() throws Exception {
|
||||
simpleContainer.setJobExecutor(new JobExecutor() {
|
||||
public ExitStatus run(JobConfiguration configuration, JobExecutionContext jobExecutionContext)
|
||||
public ExitStatus run(JobConfiguration configuration, JobExecution jobExecutionContext)
|
||||
throws BatchCriticalException {
|
||||
while (running) {
|
||||
try {
|
||||
@@ -187,7 +187,7 @@ public class SimpleJobExecutorFacaderTests extends TestCase {
|
||||
JobExecutionRegistry jobExecutionRegistry = new VolatileJobExecutionRegistry();
|
||||
simpleContainer.setJobExecutionRegistry(jobExecutionRegistry);
|
||||
SimpleJobIdentifier runtimeInformation = new SimpleJobIdentifier("TestJob");
|
||||
JobExecutionContext context = jobExecutionRegistry.register(new JobInstance(runtimeInformation, new Long(0)));
|
||||
JobExecution context = jobExecutionRegistry.register(new JobInstance(runtimeInformation, new Long(0)));
|
||||
|
||||
RepeatContextSupport stepContext = new RepeatContextSupport(null);
|
||||
RepeatContextSupport chunkContext = new RepeatContextSupport(stepContext);
|
||||
@@ -212,7 +212,7 @@ public class SimpleJobExecutorFacaderTests extends TestCase {
|
||||
JobExecutionRegistry jobExecutionRegistry = (JobExecutionRegistry) control.getMock();
|
||||
simpleContainer.setJobExecutionRegistry(jobExecutionRegistry);
|
||||
SimpleJobIdentifier runtimeInformation = new SimpleJobIdentifier("TestJob");
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(runtimeInformation, new JobInstance(runtimeInformation, new Long(0)));
|
||||
JobExecution jobExecutionContext = new JobExecution(new JobInstance(runtimeInformation, new Long(0)));
|
||||
jobExecutionContext.registerStepContext(new RepeatContextSupport(null));
|
||||
jobExecutionContext.registerChunkContext(new RepeatContextSupport(null));
|
||||
control.expectAndReturn(jobExecutionRegistry.findAll(), Collections.singleton(jobExecutionContext));
|
||||
|
||||
@@ -26,10 +26,10 @@ import junit.framework.TestCase;
|
||||
import org.springframework.batch.core.configuration.JobConfiguration;
|
||||
import org.springframework.batch.core.configuration.StepConfiguration;
|
||||
import org.springframework.batch.core.domain.BatchStatus;
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.executor.StepExecutor;
|
||||
import org.springframework.batch.core.executor.StepExecutorFactory;
|
||||
import org.springframework.batch.core.runtime.JobExecutionContext;
|
||||
import org.springframework.batch.core.runtime.JobIdentifier;
|
||||
import org.springframework.batch.core.runtime.SimpleJobIdentifier;
|
||||
import org.springframework.batch.core.tasklet.Tasklet;
|
||||
@@ -123,7 +123,7 @@ public class SimpleJobTests extends TestCase {
|
||||
|
||||
assertEquals(job.getName(), "real.job");
|
||||
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(runtimeInformation, job);
|
||||
JobExecution jobExecutionContext = new JobExecution(job);
|
||||
|
||||
jobLifecycle.run(jobConfiguration, jobExecutionContext);
|
||||
assertEquals(BatchStatus.COMPLETED, job.getStatus());
|
||||
@@ -170,7 +170,7 @@ public class SimpleJobTests extends TestCase {
|
||||
jobConfiguration.addStep(step);
|
||||
|
||||
JobInstance job = repository.findOrCreateJob(jobConfiguration, runtimeInformation);
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(runtimeInformation, job);
|
||||
JobExecution jobExecutionContext = new JobExecution(job);
|
||||
jobLifecycle.run(jobConfiguration, jobExecutionContext);
|
||||
|
||||
assertEquals(BatchStatus.COMPLETED, job.getStatus());
|
||||
@@ -194,7 +194,7 @@ public class SimpleJobTests extends TestCase {
|
||||
jobConfiguration.addStep(step);
|
||||
|
||||
JobInstance job = repository.findOrCreateJob(jobConfiguration, runtimeInformation);
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(runtimeInformation, job);
|
||||
JobExecution jobExecutionContext = new JobExecution(job);
|
||||
try {
|
||||
jobLifecycle.run(jobConfiguration, jobExecutionContext);
|
||||
fail("Expected RuntimeException");
|
||||
|
||||
@@ -19,8 +19,8 @@ import java.util.Collection;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.runtime.JobExecutionContext;
|
||||
import org.springframework.batch.core.runtime.SimpleJobIdentifier;
|
||||
|
||||
/**
|
||||
@@ -35,20 +35,20 @@ public class VolatileJobExecutionRegistryTests extends TestCase {
|
||||
private VolatileJobExecutionRegistry registry = new VolatileJobExecutionRegistry();
|
||||
|
||||
public void testAddAndRetrieveSingle() throws Exception {
|
||||
JobExecutionContext context = registry.register(job);
|
||||
JobExecution context = registry.register(job);
|
||||
assertEquals(context, registry.get(runtimeInformation));
|
||||
}
|
||||
|
||||
public void testAddAndFindAll() throws Exception {
|
||||
JobExecutionContext context = registry.register(job);
|
||||
JobExecution context = registry.register(job);
|
||||
Collection list = registry.findAll();
|
||||
assertEquals(1, list.size());
|
||||
assertTrue(list.contains(context));
|
||||
}
|
||||
|
||||
public void testAddAndFindAllMultiple() throws Exception {
|
||||
JobExecutionContext context1 = registry.register(job);
|
||||
JobExecutionContext context2 = registry.register(new JobInstance(new SimpleJobIdentifier("bar"), new Long(1)));
|
||||
JobExecution context1 = registry.register(job);
|
||||
JobExecution context2 = registry.register(new JobInstance(new SimpleJobIdentifier("bar"), new Long(1)));
|
||||
Collection list = registry.findAll();
|
||||
assertEquals(2, list.size());
|
||||
assertTrue(list.contains(context1));
|
||||
@@ -56,8 +56,8 @@ public class VolatileJobExecutionRegistryTests extends TestCase {
|
||||
}
|
||||
|
||||
public void testRegisterSamejobTwice() throws Exception {
|
||||
JobExecutionContext context1 = registry.register(job);
|
||||
JobExecutionContext context2 = registry.register(job);
|
||||
JobExecution context1 = registry.register(job);
|
||||
JobExecution context2 = registry.register(job);
|
||||
Collection list = registry.findAll();
|
||||
assertEquals(1, list.size());
|
||||
assertTrue(list.contains(context1));
|
||||
@@ -65,7 +65,7 @@ public class VolatileJobExecutionRegistryTests extends TestCase {
|
||||
}
|
||||
|
||||
public void testAddAndFindByName() throws Exception {
|
||||
JobExecutionContext context = registry.register(job);
|
||||
JobExecution context = registry.register(job);
|
||||
registry.register(job);
|
||||
Collection list = registry.findByName(runtimeInformation.getName());
|
||||
assertEquals(1, list.size());
|
||||
|
||||
@@ -26,15 +26,14 @@ import org.springframework.batch.core.configuration.StepConfiguration;
|
||||
import org.springframework.batch.core.domain.BatchStatus;
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.StepExecution;
|
||||
import org.springframework.batch.core.domain.StepInstance;
|
||||
import org.springframework.batch.core.executor.ExitCodeExceptionClassifier;
|
||||
import org.springframework.batch.core.executor.StepExecutor;
|
||||
import org.springframework.batch.core.executor.StepExecutorFactory;
|
||||
import org.springframework.batch.core.executor.StepInterruptedException;
|
||||
import org.springframework.batch.core.repository.JobRepository;
|
||||
import org.springframework.batch.core.runtime.JobExecutionContext;
|
||||
import org.springframework.batch.core.runtime.SimpleJobIdentifier;
|
||||
import org.springframework.batch.core.runtime.StepExecutionContext;
|
||||
import org.springframework.batch.core.tasklet.Tasklet;
|
||||
import org.springframework.batch.execution.repository.SimpleJobRepository;
|
||||
import org.springframework.batch.execution.repository.dao.JobDao;
|
||||
@@ -63,7 +62,7 @@ public class DefaultJobExecutorTests extends TestCase {
|
||||
private List list = new ArrayList();
|
||||
|
||||
StepExecutor defaultStepLifecycle = new StepExecutor() {
|
||||
public ExitStatus process(StepConfiguration configuration, StepExecutionContext stepExecutionContext)
|
||||
public ExitStatus process(StepConfiguration configuration, StepExecution stepExecution)
|
||||
throws StepInterruptedException, BatchCriticalException {
|
||||
list.add("default");
|
||||
return ExitStatus.FINISHED;
|
||||
@@ -71,7 +70,7 @@ public class DefaultJobExecutorTests extends TestCase {
|
||||
};
|
||||
|
||||
StepExecutor configurationStepLifecycle = new StepExecutor() {
|
||||
public ExitStatus process(StepConfiguration configuration, StepExecutionContext stepExecutionContext)
|
||||
public ExitStatus process(StepConfiguration configuration, StepExecution stepExecution)
|
||||
throws StepInterruptedException, BatchCriticalException {
|
||||
list.add("special");
|
||||
return ExitStatus.FINISHED;
|
||||
@@ -80,15 +79,15 @@ public class DefaultJobExecutorTests extends TestCase {
|
||||
|
||||
private JobInstance job;
|
||||
|
||||
private JobExecutionContext jobExecutionContext;
|
||||
private JobExecution jobExecution;
|
||||
|
||||
private StepInstance step1;
|
||||
|
||||
private StepInstance step2;
|
||||
|
||||
private StepExecutionContext stepExecutionContext1;
|
||||
private StepExecution stepExecution1;
|
||||
|
||||
private StepExecutionContext stepExecutionContext2;
|
||||
private StepExecution stepExecution2;
|
||||
|
||||
private AbstractStepConfiguration stepConfiguration1;
|
||||
|
||||
@@ -131,13 +130,13 @@ public class DefaultJobExecutorTests extends TestCase {
|
||||
|
||||
job = jobRepository.findOrCreateJob(jobConfiguration, jobIdentifer);
|
||||
|
||||
jobExecutionContext = new JobExecutionContext(jobIdentifer, job);
|
||||
jobExecution = new JobExecution(job);
|
||||
|
||||
List steps = job.getSteps();
|
||||
step1 = (StepInstance) steps.get(0);
|
||||
step2 = (StepInstance) steps.get(1);
|
||||
stepExecutionContext1 = new StepExecutionContext(jobExecutionContext, step1);
|
||||
stepExecutionContext2 = new StepExecutionContext(jobExecutionContext, step2);
|
||||
stepExecution1 = new StepExecution(step1, jobExecution);
|
||||
stepExecution2 = new StepExecution(step2, jobExecution);
|
||||
|
||||
}
|
||||
|
||||
@@ -149,7 +148,7 @@ public class DefaultJobExecutorTests extends TestCase {
|
||||
|
||||
stepConfiguration1.setStartLimit(5);
|
||||
stepConfiguration2.setStartLimit(5);
|
||||
jobExecutor.run(jobConfiguration, jobExecutionContext);
|
||||
jobExecutor.run(jobConfiguration, jobExecution);
|
||||
assertEquals(2, list.size());
|
||||
checkRepository(BatchStatus.COMPLETED);
|
||||
}
|
||||
@@ -173,7 +172,7 @@ public class DefaultJobExecutorTests extends TestCase {
|
||||
return ExitStatus.FINISHED;
|
||||
}
|
||||
});
|
||||
jobExecutor.run(jobConfiguration, jobExecutionContext);
|
||||
jobExecutor.run(jobConfiguration, jobExecution);
|
||||
assertEquals(2, list.size());
|
||||
checkRepository(BatchStatus.COMPLETED, ExitStatus.FINISHED.getExitCode());
|
||||
}
|
||||
@@ -182,9 +181,9 @@ public class DefaultJobExecutorTests extends TestCase {
|
||||
public void testExecutionContextIsSet() throws Exception {
|
||||
|
||||
testRunNormally();
|
||||
assertEquals(job, jobExecutionContext.getJob());
|
||||
assertEquals(step1, stepExecutionContext1.getStep());
|
||||
assertEquals(step2, stepExecutionContext2.getStep());
|
||||
assertEquals(job, jobExecution.getJob());
|
||||
assertEquals(step1, stepExecution1.getStep());
|
||||
assertEquals(step2, stepExecution2.getStep());
|
||||
}
|
||||
|
||||
public void testRunWithNonDefaultExecutor() throws Exception {
|
||||
@@ -197,7 +196,7 @@ public class DefaultJobExecutorTests extends TestCase {
|
||||
stepConfiguration1.setStartLimit(5);
|
||||
stepConfiguration2.setStartLimit(5);
|
||||
|
||||
jobExecutor.run(jobConfiguration, jobExecutionContext);
|
||||
jobExecutor.run(jobConfiguration, jobExecution);
|
||||
|
||||
assertEquals(2, list.size());
|
||||
assertEquals("special", list.get(0));
|
||||
@@ -210,13 +209,13 @@ public class DefaultJobExecutorTests extends TestCase {
|
||||
stepConfiguration2.setStartLimit(5);
|
||||
final StepInterruptedException exception = new StepInterruptedException("Interrupt!");
|
||||
defaultStepLifecycle = new StepExecutor() {
|
||||
public ExitStatus process(StepConfiguration configuration, StepExecutionContext stepExecutionContext)
|
||||
public ExitStatus process(StepConfiguration configuration, StepExecution stepExecution)
|
||||
throws StepInterruptedException, BatchCriticalException {
|
||||
throw exception;
|
||||
}
|
||||
};
|
||||
try {
|
||||
jobExecutor.run(jobConfiguration, jobExecutionContext);
|
||||
jobExecutor.run(jobConfiguration, jobExecution);
|
||||
}
|
||||
catch (BatchCriticalException e) {
|
||||
assertEquals(exception, e.getCause());
|
||||
@@ -230,13 +229,13 @@ public class DefaultJobExecutorTests extends TestCase {
|
||||
stepConfiguration2.setStartLimit(5);
|
||||
final RuntimeException exception = new RuntimeException("Foo!");
|
||||
defaultStepLifecycle = new StepExecutor() {
|
||||
public ExitStatus process(StepConfiguration configuration, StepExecutionContext stepExecutionContext)
|
||||
public ExitStatus process(StepConfiguration configuration, StepExecution stepExecution)
|
||||
throws StepInterruptedException, BatchCriticalException {
|
||||
throw exception;
|
||||
}
|
||||
};
|
||||
try {
|
||||
jobExecutor.run(jobConfiguration, jobExecutionContext);
|
||||
jobExecutor.run(jobConfiguration, jobExecution);
|
||||
}
|
||||
catch (RuntimeException e) {
|
||||
assertEquals(exception, e);
|
||||
@@ -250,7 +249,7 @@ public class DefaultJobExecutorTests extends TestCase {
|
||||
stepConfiguration1.setStartLimit(0);
|
||||
|
||||
try{
|
||||
jobExecutor.run(jobConfiguration, jobExecutionContext);
|
||||
jobExecutor.run(jobConfiguration, jobExecution);
|
||||
fail();
|
||||
}
|
||||
catch( Exception ex ){
|
||||
|
||||
@@ -33,18 +33,16 @@ public class MockStepDao implements StepDao {
|
||||
public StepInstance createStep(JobInstance job, String stepName) {
|
||||
StepInstance newStep = (StepInstance) newSteps.get(currentNewStep);
|
||||
currentNewStep++;
|
||||
newStep.setName(stepName);
|
||||
return newStep;
|
||||
}
|
||||
|
||||
public StepInstance findStep(JobInstance job, String stepName) {
|
||||
StepInstance newStep = (StepInstance) newSteps.get(currentNewStep);
|
||||
currentNewStep++;
|
||||
newStep.setName(stepName);
|
||||
return newStep;
|
||||
}
|
||||
|
||||
public List findSteps(Long jobId) {
|
||||
public List findSteps(JobInstance job) {
|
||||
return newSteps;
|
||||
}
|
||||
|
||||
|
||||
@@ -276,7 +276,7 @@ public class SimpleJobRepositoryTests extends TestCase {
|
||||
|
||||
public void testSaveOrUpdateValidJobExecution() throws Exception {
|
||||
|
||||
JobExecution jobExecution = new JobExecution(new Long(1));
|
||||
JobExecution jobExecution = new JobExecution(new JobInstance(null, new Long(1)));
|
||||
|
||||
// new execution - call save on job dao
|
||||
jobDao.save(jobExecution);
|
||||
@@ -312,7 +312,7 @@ public class SimpleJobRepositoryTests extends TestCase {
|
||||
}
|
||||
|
||||
public void testUpdateStepExecution(){
|
||||
StepExecution stepExecution = new StepExecution(new Long(10), null);
|
||||
StepExecution stepExecution = new StepExecution(new StepInstance(new Long(10L)), null);
|
||||
stepExecution.setId(new Long(11));
|
||||
stepDao.update(stepExecution);
|
||||
stepDaoControl.replay();
|
||||
@@ -321,7 +321,7 @@ public class SimpleJobRepositoryTests extends TestCase {
|
||||
}
|
||||
|
||||
public void testSaveStepExecution(){
|
||||
StepExecution stepExecution = new StepExecution(new Long(10), null);
|
||||
StepExecution stepExecution = new StepExecution(new StepInstance(new Long(10L)), null);
|
||||
//TODO: Not sure why, but calling save on the EasyMock stepDao causes a NullPointerException
|
||||
// stepDao.save(stepExecution);
|
||||
// stepDaoControl.replay();
|
||||
|
||||
@@ -80,7 +80,7 @@ public abstract class AbstractJobDaoTests extends
|
||||
|
||||
// Create an execution
|
||||
jobExecutionStartTime = new Timestamp(System.currentTimeMillis());
|
||||
jobExecution = new JobExecution(job.getId());
|
||||
jobExecution = new JobExecution(new JobInstance(jobRuntimeInformation, job.getId()));
|
||||
jobExecution.setStartTime(jobExecutionStartTime);
|
||||
jobExecution.setStatus(BatchStatus.STARTED);
|
||||
jobDao.save(jobExecution);
|
||||
@@ -183,7 +183,7 @@ public abstract class AbstractJobDaoTests extends
|
||||
|
||||
public void testUpdateInvalidJobExecution() {
|
||||
|
||||
JobExecution execution = new JobExecution(job.getId());
|
||||
JobExecution execution = new JobExecution(job);
|
||||
// id is invalid
|
||||
execution.setId(new Long(29432));
|
||||
try {
|
||||
@@ -196,7 +196,7 @@ public abstract class AbstractJobDaoTests extends
|
||||
|
||||
public void testUpdateNullIdJobExection() {
|
||||
|
||||
JobExecution execution = new JobExecution(job.getId());
|
||||
JobExecution execution = new JobExecution(job);
|
||||
try {
|
||||
jobDao.update(execution);
|
||||
fail();
|
||||
@@ -211,7 +211,7 @@ public abstract class AbstractJobDaoTests extends
|
||||
assertEquals(jobDao.getJobExecutionCount(job.getId()), 1);
|
||||
|
||||
// Save new JobExecution for same job
|
||||
JobExecution testJobExecution = new JobExecution(job.getId());
|
||||
JobExecution testJobExecution = new JobExecution(job);
|
||||
jobDao.save(testJobExecution);
|
||||
// JobExecutionCount should be incremented by 1
|
||||
assertEquals(jobDao.getJobExecutionCount(job.getId()), 2);
|
||||
@@ -256,8 +256,8 @@ public abstract class AbstractJobDaoTests extends
|
||||
RowMapper rowMapper = new RowMapper() {
|
||||
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
|
||||
JobExecution execution = new JobExecution(new Long(rs
|
||||
.getLong(1)));
|
||||
JobExecution execution = new JobExecution(new JobInstance(jobRuntimeInformation, new Long(rs
|
||||
.getLong(1))));
|
||||
execution.setStartTime(rs.getTimestamp(2));
|
||||
execution.setEndTime(rs.getTimestamp(3));
|
||||
execution.setStatus(BatchStatus.getStatus(rs.getString(4)));
|
||||
|
||||
@@ -21,6 +21,7 @@ import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.springframework.batch.core.domain.BatchStatus;
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.StepExecution;
|
||||
import org.springframework.batch.core.domain.StepInstance;
|
||||
@@ -54,6 +55,8 @@ public abstract class AbstractStepDaoTests extends AbstractTransactionalDataSour
|
||||
|
||||
protected StepExecution stepExecution;
|
||||
|
||||
protected JobExecution jobExecution;
|
||||
|
||||
public void setJobDao(JobDao jobDao) {
|
||||
this.jobDao = jobDao;
|
||||
}
|
||||
@@ -79,8 +82,9 @@ public abstract class AbstractStepDaoTests extends AbstractTransactionalDataSour
|
||||
job = jobDao.createJob(jobIdentifier);
|
||||
step1 = stepDao.createStep(job, "TestStep1");
|
||||
step2 = stepDao.createStep(job, "TestStep2");
|
||||
jobExecution = new JobExecution(step2.getJob());
|
||||
|
||||
stepExecution = new StepExecution(step1.getId(), new Long(23));
|
||||
stepExecution = new StepExecution(step1, jobExecution);
|
||||
stepExecution.setStatus(BatchStatus.STARTED);
|
||||
stepExecution.setStartTime(new Timestamp(System.currentTimeMillis()));
|
||||
stepDao.save(stepExecution);
|
||||
@@ -110,7 +114,7 @@ public abstract class AbstractStepDaoTests extends AbstractTransactionalDataSour
|
||||
|
||||
public void testFindSteps(){
|
||||
|
||||
List steps = stepDao.findSteps(job.getId());
|
||||
List steps = stepDao.findSteps(job);
|
||||
assertEquals(steps.size(), 2);
|
||||
assertTrue(steps.contains(step1));
|
||||
assertTrue(steps.contains(step2));
|
||||
@@ -119,7 +123,7 @@ public abstract class AbstractStepDaoTests extends AbstractTransactionalDataSour
|
||||
public void testFindStepsNotSaved(){
|
||||
|
||||
//no steps are saved for given id, empty list should be returned
|
||||
List steps = stepDao.findSteps(new Long(38922));
|
||||
List steps = stepDao.findSteps(new JobInstance(null, new Long(38922)));
|
||||
assertEquals(steps.size(), 0);
|
||||
}
|
||||
|
||||
@@ -154,7 +158,7 @@ public abstract class AbstractStepDaoTests extends AbstractTransactionalDataSour
|
||||
|
||||
public void testSaveStepExecution(){
|
||||
|
||||
StepExecution execution = new StepExecution(step2.getId(), new Long(10));
|
||||
StepExecution execution = new StepExecution(step2, jobExecution);
|
||||
execution.setStatus(BatchStatus.STARTED);
|
||||
execution.setStartTime(new Timestamp(System.currentTimeMillis()));
|
||||
Properties statistics = new Properties();
|
||||
@@ -210,7 +214,7 @@ public abstract class AbstractStepDaoTests extends AbstractTransactionalDataSour
|
||||
public void testIncrementStepExecutionCount(){
|
||||
|
||||
assertEquals(1, stepDao.getStepExecutionCount(step1.getId()));
|
||||
StepExecution execution = new StepExecution(step1.getId(), new Long(9));
|
||||
StepExecution execution = new StepExecution(step1, new JobExecution(step1.getJob(), new Long(123)));
|
||||
stepDao.save(execution);
|
||||
assertEquals(2, stepDao.getStepExecutionCount(step1.getId()));
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ package org.springframework.batch.execution.repository.dao;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.hibernate.SessionFactory;
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.StepExecution;
|
||||
import org.springframework.batch.core.domain.StepInstance;
|
||||
import org.springframework.batch.support.PropertiesConverter;
|
||||
@@ -38,7 +39,7 @@ public class HibernateStepDaoTests extends AbstractStepDaoTests {
|
||||
|
||||
public void testSaveStatistics() throws Exception {
|
||||
StepInstance step = stepDao.createStep(job, "foo");
|
||||
StepExecution stepExecution = new StepExecution(step.getId(), new Long(10));
|
||||
StepExecution stepExecution = new StepExecution(step, new JobExecution(step.getJob()));
|
||||
Properties statistics = new Properties();
|
||||
statistics.setProperty("x", "y");
|
||||
statistics.setProperty("a", "b");
|
||||
|
||||
@@ -53,22 +53,22 @@ public class MapJobDaoTests extends TestCase {
|
||||
|
||||
public void testSaveExecutionUpdatesId() throws Exception {
|
||||
JobInstance job = dao.createJob(new SimpleJobIdentifier("foo"));
|
||||
JobExecution execution = new JobExecution(job.getId());
|
||||
JobExecution execution = new JobExecution(job);
|
||||
assertNull(execution.getId());
|
||||
dao.save(execution);
|
||||
assertNotNull(execution.getId());
|
||||
}
|
||||
public void testCorrectExecutionCountForExistingJob() throws Exception {
|
||||
JobInstance job = dao.createJob(new SimpleJobIdentifier("foo"));
|
||||
dao.save(new JobExecution(job.getId()));
|
||||
dao.save(new JobExecution(job));
|
||||
assertEquals(1, dao.getJobExecutionCount(job.getId()));
|
||||
}
|
||||
|
||||
public void testMultipleExecutionsPerExisting() throws Exception {
|
||||
JobInstance job = dao.createJob(new SimpleJobIdentifier("foo"));
|
||||
dao.save(new JobExecution(job.getId()));
|
||||
dao.save(new JobExecution(job));
|
||||
Thread.sleep(50L); // Hack, hack, hackety, hack - job executions are not unique if created too close together!
|
||||
dao.save(new JobExecution(job.getId()));
|
||||
dao.save(new JobExecution(job));
|
||||
assertEquals(2, dao.getJobExecutionCount(job.getId()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,19 +62,19 @@ public class MapStepDaoTests extends TestCase {
|
||||
}
|
||||
|
||||
public void testCreateAndRetrieveSingleFromList() throws Exception {
|
||||
List result = dao.findSteps(job.getId());
|
||||
List result = dao.findSteps(job);
|
||||
assertTrue(result.contains(step));
|
||||
}
|
||||
|
||||
public void testCreateAndRetrieveMultiple() throws Exception {
|
||||
step = dao.createStep(job, "bar");
|
||||
List result = dao.findSteps(job.getId());
|
||||
List result = dao.findSteps(job);
|
||||
assertEquals(2, result.size());
|
||||
assertTrue(result.contains(step));
|
||||
}
|
||||
|
||||
public void testFindWithEmptyResults() throws Exception {
|
||||
List result = dao.findSteps(new Long(22));
|
||||
List result = dao.findSteps(new JobInstance(null, new Long(22)));
|
||||
assertEquals(0, result.size());
|
||||
}
|
||||
|
||||
@@ -88,20 +88,20 @@ public class MapStepDaoTests extends TestCase {
|
||||
}
|
||||
|
||||
public void testSaveExecutionUpdatesId() throws Exception {
|
||||
StepExecution execution = new StepExecution(step.getId(), null);
|
||||
StepExecution execution = new StepExecution(step, null);
|
||||
assertNull(execution.getId());
|
||||
dao.save(execution);
|
||||
assertNotNull(execution.getId());
|
||||
}
|
||||
|
||||
public void testCorrectExecutionCountForExisting() throws Exception {
|
||||
dao.save(new StepExecution(step.getId(), null));
|
||||
dao.save(new StepExecution(step, null));
|
||||
assertEquals(1, dao.getStepExecutionCount(step.getId()));
|
||||
}
|
||||
|
||||
public void testOnlyOneExecutionPerStep() throws Exception {
|
||||
dao.save(new StepExecution(step.getId(), null));
|
||||
dao.save(new StepExecution(step.getId(), null));
|
||||
dao.save(new StepExecution(step, null));
|
||||
dao.save(new StepExecution(step, null));
|
||||
assertEquals(2, dao.getStepExecutionCount(step.getId()));
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import junit.framework.TestCase;
|
||||
|
||||
import org.easymock.MockControl;
|
||||
import org.springframework.batch.core.domain.BatchStatus;
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.StepExecution;
|
||||
import org.springframework.batch.core.domain.StepInstance;
|
||||
@@ -24,9 +25,9 @@ public class SqlStepDaoPrefixTests extends TestCase {
|
||||
|
||||
MockJdbcTemplate jdbcTemplate = new MockJdbcTemplate();
|
||||
|
||||
StepExecution stepExecution = new StepExecution(new Long(1), new Long(2));
|
||||
StepInstance step = new StepInstance(new Long(1));
|
||||
JobInstance job = new JobInstance(null, new Long(1));
|
||||
StepInstance step = new StepInstance(job, "foo", new Long(1));
|
||||
StepExecution stepExecution = new StepExecution(step, new JobExecution(job));
|
||||
|
||||
MockControl stepExecutionIncrementerControl = MockControl.createControl(DataFieldMaxValueIncrementer.class);
|
||||
DataFieldMaxValueIncrementer stepExecutionIncrementer;
|
||||
@@ -37,6 +38,7 @@ public class SqlStepDaoPrefixTests extends TestCase {
|
||||
super.setUp();
|
||||
|
||||
stepDao = new SqlStepDao();
|
||||
stepDao.setJobDao(new MapJobDao());
|
||||
stepExecutionIncrementer = (DataFieldMaxValueIncrementer)stepExecutionIncrementerControl.getMock();
|
||||
stepIncrementer = (DataFieldMaxValueIncrementer)stepIncrementerControl.getMock();
|
||||
|
||||
@@ -88,7 +90,7 @@ public class SqlStepDaoPrefixTests extends TestCase {
|
||||
|
||||
public void testModifiedFindSteps(){
|
||||
stepDao.setTablePrefix("FOO_");
|
||||
stepDao.findSteps(new Long(1));
|
||||
stepDao.findSteps(new JobInstance(null, new Long(1)));
|
||||
assertTrue(jdbcTemplate.getSqlStatement().indexOf("FOO_STEP") != -1);
|
||||
}
|
||||
|
||||
@@ -119,7 +121,7 @@ public class SqlStepDaoPrefixTests extends TestCase {
|
||||
}
|
||||
|
||||
public void testDefaultFindSteps(){
|
||||
stepDao.findSteps(new Long(1));
|
||||
stepDao.findSteps(new JobInstance(null, new Long(1)));
|
||||
assertTrue(jdbcTemplate.getSqlStatement().indexOf("BATCH_STEP") != -1);
|
||||
}
|
||||
|
||||
|
||||
@@ -19,8 +19,8 @@ import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.batch.core.configuration.StepConfiguration;
|
||||
import org.springframework.batch.core.configuration.StepConfigurationSupport;
|
||||
import org.springframework.batch.core.domain.StepExecution;
|
||||
import org.springframework.batch.core.executor.StepExecutor;
|
||||
import org.springframework.batch.core.runtime.StepExecutionContext;
|
||||
import org.springframework.batch.execution.step.simple.SimpleStepConfiguration;
|
||||
import org.springframework.batch.execution.step.simple.SimpleStepExecutor;
|
||||
import org.springframework.batch.io.exception.BatchCriticalException;
|
||||
@@ -90,7 +90,7 @@ public class DefaultStepExecutorFactoryTests extends TestCase {
|
||||
|
||||
public void testSuccessfulStepExecutorWithSimpleConfigurationAndNotSimpleExecutor() throws Exception {
|
||||
StepExecutor executor = new StepExecutor() {
|
||||
public ExitStatus process(StepConfiguration configuration, StepExecutionContext stepExecutionContext) throws BatchCriticalException {
|
||||
public ExitStatus process(StepConfiguration configuration, StepExecution stepExecution) throws BatchCriticalException {
|
||||
return ExitStatus.FINISHED;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -21,13 +21,12 @@ import java.util.Arrays;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.StepExecution;
|
||||
import org.springframework.batch.core.domain.StepInstance;
|
||||
import org.springframework.batch.core.executor.ExitCodeExceptionClassifier;
|
||||
import org.springframework.batch.core.runtime.JobExecutionContext;
|
||||
import org.springframework.batch.core.runtime.SimpleJobIdentifier;
|
||||
import org.springframework.batch.core.runtime.StepExecutionContext;
|
||||
import org.springframework.batch.core.tasklet.Tasklet;
|
||||
import org.springframework.batch.execution.repository.SimpleJobRepository;
|
||||
import org.springframework.batch.execution.repository.dao.MapJobDao;
|
||||
@@ -95,10 +94,10 @@ public class DefaultStepExecutorTests extends TestCase {
|
||||
|
||||
StepInstance step = new StepInstance(new Long(9));
|
||||
SimpleJobIdentifier jobIdentifier = new SimpleJobIdentifier("FOO");
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(jobIdentifier, new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecutionContext stepExecutionContext = new StepExecutionContext(jobExecutionContext, step);
|
||||
JobExecution jobExecutionContext = new JobExecution(new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecution stepExecution = new StepExecution(step, jobExecutionContext);
|
||||
|
||||
stepExecutor.process(stepConfiguration, stepExecutionContext);
|
||||
stepExecutor.process(stepConfiguration, stepExecution);
|
||||
assertEquals(1, processed.size());
|
||||
}
|
||||
|
||||
@@ -111,12 +110,12 @@ public class DefaultStepExecutorTests extends TestCase {
|
||||
stepExecutor.setChunkOperations(template);
|
||||
|
||||
StepInstance step = new StepInstance(new Long(1));
|
||||
step.setStepExecution(new StepExecution(new Long(1), new Long(2)));
|
||||
SimpleJobIdentifier jobIdentifier = new SimpleJobIdentifier("FOO");
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(jobIdentifier, new JobInstance(jobIdentifier, new Long(1)));
|
||||
JobExecution jobExecution = new JobExecution(new JobInstance(jobIdentifier, new Long(1)));
|
||||
step.setStepExecution(new StepExecution(step, jobExecution));
|
||||
|
||||
StepExecutionContext stepExecutionContext = new StepExecutionContext(jobExecutionContext, step);
|
||||
stepExecutor.processChunk(stepConfiguration, stepExecutionContext);
|
||||
StepExecution stepExecution = new StepExecution(step, jobExecution);
|
||||
stepExecutor.processChunk(stepConfiguration, stepExecution);
|
||||
assertEquals(1, processed.size());
|
||||
|
||||
}
|
||||
@@ -130,23 +129,23 @@ public class DefaultStepExecutorTests extends TestCase {
|
||||
stepExecutor.setChunkOperations(template);
|
||||
|
||||
final StepInstance step = new StepInstance(new Long(1));
|
||||
step.setStepExecution(new StepExecution(new Long(1),new Long(1)));
|
||||
SimpleJobIdentifier jobIdentifier = new SimpleJobIdentifier("FOO");
|
||||
final JobExecutionContext jobExecutionContext = new JobExecutionContext(jobIdentifier, new JobInstance(jobIdentifier, new Long(3)));
|
||||
final StepExecutionContext stepExecutionContext = new StepExecutionContext(jobExecutionContext, step);
|
||||
final JobExecution jobExecution = new JobExecution(new JobInstance(jobIdentifier, new Long(3)));
|
||||
step.setStepExecution(new StepExecution(step,jobExecution));
|
||||
final StepExecution stepExecution = new StepExecution(step, jobExecution);
|
||||
|
||||
stepConfiguration.setTasklet(new Tasklet() {
|
||||
public ExitStatus execute() throws Exception {
|
||||
assertEquals(step, stepExecutionContext.getStep());
|
||||
assertEquals(1, jobExecutionContext.getChunkContexts().size());
|
||||
assertEquals(1, jobExecutionContext.getStepContexts().size());
|
||||
assertEquals(step, stepExecution.getStep());
|
||||
assertEquals(1, jobExecution.getChunkContexts().size());
|
||||
assertEquals(1, jobExecution.getStepContexts().size());
|
||||
assertNotNull(StepSynchronizationManager.getContext().getJobIdentifier());
|
||||
processed.add("foo");
|
||||
return ExitStatus.CONTINUABLE;
|
||||
}
|
||||
});
|
||||
|
||||
stepExecutor.process(stepConfiguration, stepExecutionContext);
|
||||
stepExecutor.process(stepConfiguration, stepExecution);
|
||||
assertEquals(1, processed.size());
|
||||
|
||||
}
|
||||
@@ -158,10 +157,10 @@ public class DefaultStepExecutorTests extends TestCase {
|
||||
|
||||
StepInstance step = new StepInstance(new Long(1));
|
||||
SimpleJobIdentifier jobIdentifier = new SimpleJobIdentifier("FOO");
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(jobIdentifier, new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecutionContext stepExecutionContext = new StepExecutionContext(jobExecutionContext, step);
|
||||
JobExecution jobExecutionContext = new JobExecution(new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecution stepExecution = new StepExecution(step, jobExecutionContext);
|
||||
|
||||
stepExecutor.process(stepConfiguration, stepExecutionContext);
|
||||
stepExecutor.process(stepConfiguration, stepExecution);
|
||||
assertEquals(1, processed.size());
|
||||
}
|
||||
|
||||
@@ -185,11 +184,11 @@ public class DefaultStepExecutorTests extends TestCase {
|
||||
StepInstance step = new StepInstance(new Long(1));
|
||||
stepConfiguration.setTasklet(tasklet);
|
||||
SimpleJobIdentifier jobIdentifier = new SimpleJobIdentifier("FOO");
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(jobIdentifier, new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecutionContext stepExecutionContext = new StepExecutionContext(jobExecutionContext, step);
|
||||
JobExecution jobExecutionContext = new JobExecution(new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecution stepExecution = new StepExecution(step, jobExecutionContext);
|
||||
|
||||
try{
|
||||
stepExecutor.process(stepConfiguration, stepExecutionContext);
|
||||
stepExecutor.process(stepConfiguration, stepExecution);
|
||||
}
|
||||
catch(Exception ex){
|
||||
assertEquals(step.getStepExecution().getRollbackCount(), new Integer(1));
|
||||
@@ -217,11 +216,11 @@ public class DefaultStepExecutorTests extends TestCase {
|
||||
StepInstance step = new StepInstance(new Long(1));
|
||||
stepConfiguration.setTasklet(tasklet);
|
||||
SimpleJobIdentifier jobIdentifier = new SimpleJobIdentifier("FOO");
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(jobIdentifier, new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecutionContext stepExecutionContext = new StepExecutionContext(jobExecutionContext, step);
|
||||
JobExecution jobExecutionContext = new JobExecution(new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecution stepExecution = new StepExecution(step, jobExecutionContext);
|
||||
|
||||
try{
|
||||
stepExecutor.process(stepConfiguration, stepExecutionContext);
|
||||
stepExecutor.process(stepConfiguration, stepExecution);
|
||||
}
|
||||
catch(Exception ex){
|
||||
assertEquals(step.getStepExecution().getExitCode(), ExitCodeExceptionClassifier.FATAL_EXCEPTION);
|
||||
@@ -240,11 +239,11 @@ public class DefaultStepExecutorTests extends TestCase {
|
||||
stepConfiguration.setTasklet(tasklet);
|
||||
stepConfiguration.setSaveRestartData(true);
|
||||
SimpleJobIdentifier jobIdentifier = new SimpleJobIdentifier("FOO");
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(jobIdentifier, new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecutionContext stepExecutionContext = new StepExecutionContext(jobExecutionContext, step);
|
||||
JobExecution jobExecutionContext = new JobExecution(new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecution stepExecution = new StepExecution(step, jobExecutionContext);
|
||||
|
||||
try{
|
||||
stepExecutor.process(stepConfiguration, stepExecutionContext);
|
||||
stepExecutor.process(stepConfiguration, stepExecution);
|
||||
}catch(Throwable t){
|
||||
fail();
|
||||
}
|
||||
@@ -264,11 +263,11 @@ public class DefaultStepExecutorTests extends TestCase {
|
||||
stepConfiguration.setTasklet(tasklet);
|
||||
stepConfiguration.setSaveRestartData(true);
|
||||
SimpleJobIdentifier jobIdentifier = new SimpleJobIdentifier("FOO");
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(jobIdentifier, new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecutionContext stepExecutionContext = new StepExecutionContext(jobExecutionContext, step);
|
||||
JobExecution jobExecutionContext = new JobExecution(new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecution stepExecution = new StepExecution(step, jobExecutionContext);
|
||||
|
||||
try{
|
||||
stepExecutor.process(stepConfiguration, stepExecutionContext);
|
||||
stepExecutor.process(stepConfiguration, stepExecution);
|
||||
}catch(Throwable t){
|
||||
fail();
|
||||
}
|
||||
@@ -288,11 +287,11 @@ public class DefaultStepExecutorTests extends TestCase {
|
||||
stepConfiguration.setTasklet(tasklet);
|
||||
stepConfiguration.setSaveRestartData(false);
|
||||
SimpleJobIdentifier jobIdentifier = new SimpleJobIdentifier("FOO");
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(jobIdentifier, new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecutionContext stepExecutionContext = new StepExecutionContext(jobExecutionContext, step);
|
||||
JobExecution jobExecutionContext = new JobExecution(new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecution stepExecution = new StepExecution(step, jobExecutionContext);
|
||||
|
||||
try{
|
||||
stepExecutor.process(stepConfiguration, stepExecutionContext);
|
||||
stepExecutor.process(stepConfiguration, stepExecution);
|
||||
}catch(Throwable t){
|
||||
fail();
|
||||
}
|
||||
@@ -315,11 +314,11 @@ public class DefaultStepExecutorTests extends TestCase {
|
||||
}});
|
||||
stepConfiguration.setSaveRestartData(true);
|
||||
SimpleJobIdentifier jobIdentifier = new SimpleJobIdentifier("FOO");
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(jobIdentifier, new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecutionContext stepExecutionContext = new StepExecutionContext(jobExecutionContext, step);
|
||||
JobExecution jobExecution = new JobExecution(new JobInstance(jobIdentifier, new Long(3)));
|
||||
StepExecution stepExecution = new StepExecution(step, jobExecution);
|
||||
|
||||
try{
|
||||
stepExecutor.process(stepConfiguration, stepExecutionContext);
|
||||
stepExecutor.process(stepConfiguration, stepExecution);
|
||||
}catch(Throwable t){
|
||||
fail();
|
||||
}
|
||||
@@ -388,10 +387,10 @@ public class DefaultStepExecutorTests extends TestCase {
|
||||
StepInstance step = new StepInstance(new Long(1));
|
||||
stepConfiguration.setTasklet(tasklet);
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(new SimpleJobIdentifier("FOO"), new JobInstance(new Long(3)));
|
||||
StepExecutionContext stepExecutionContext = new StepExecutionContext(jobExecutionContext, step);
|
||||
StepExecution stepExecution = new StepExecution(step, jobExecutionContext);
|
||||
|
||||
try{
|
||||
stepExecutor.process(stepConfiguration, stepExecutionContext);
|
||||
stepExecutor.process(stepConfiguration, stepExecution);
|
||||
}
|
||||
catch(Exception ex){
|
||||
assertEquals(ExitCodeExceptionClassifier.STEP_INTERRUPTED, step.getStepExecution().getExitCode() );
|
||||
|
||||
@@ -22,14 +22,14 @@ import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.batch.core.configuration.JobConfiguration;
|
||||
import org.springframework.batch.core.domain.BatchStatus;
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.StepExecution;
|
||||
import org.springframework.batch.core.domain.StepInstance;
|
||||
import org.springframework.batch.core.executor.StepInterruptedException;
|
||||
import org.springframework.batch.core.repository.JobRepository;
|
||||
import org.springframework.batch.core.runtime.JobExecutionContext;
|
||||
import org.springframework.batch.core.runtime.JobIdentifier;
|
||||
import org.springframework.batch.core.runtime.SimpleJobIdentifier;
|
||||
import org.springframework.batch.core.runtime.StepExecutionContext;
|
||||
import org.springframework.batch.core.tasklet.Tasklet;
|
||||
import org.springframework.batch.execution.repository.SimpleJobRepository;
|
||||
import org.springframework.batch.execution.repository.dao.JobDao;
|
||||
@@ -73,8 +73,8 @@ public class StepExecutorInterruptionTests extends TestCase {
|
||||
|
||||
List steps = job.getSteps();
|
||||
final StepInstance step = (StepInstance) steps.get(0);
|
||||
JobExecutionContext jobExecutionContext = new JobExecutionContext(null, new JobInstance(null, new Long(0)));
|
||||
final StepExecutionContext stepExecutionContext = new StepExecutionContext(jobExecutionContext, step);
|
||||
JobExecution jobExecutionContext = new JobExecution(new JobInstance(null, new Long(0)));
|
||||
final StepExecution stepExecution = new StepExecution(step, jobExecutionContext);
|
||||
stepConfiguration.setTasklet(new Tasklet() {
|
||||
public ExitStatus execute() throws Exception {
|
||||
// do something non-trivial (and not Thread.sleep())
|
||||
@@ -90,7 +90,7 @@ public class StepExecutorInterruptionTests extends TestCase {
|
||||
Thread processingThread = new Thread() {
|
||||
public void run() {
|
||||
try {
|
||||
executor.process(stepConfiguration, stepExecutionContext);
|
||||
executor.process(stepConfiguration, stepExecution);
|
||||
}
|
||||
catch (StepInterruptedException e) {
|
||||
// do nothing...
|
||||
|
||||
@@ -14,7 +14,8 @@
|
||||
<bean id="stepDao" class="org.springframework.batch.execution.repository.dao.SqlStepDao" >
|
||||
<property name="jdbcTemplate" ref="jdbcTemplate" />
|
||||
<property name="stepIncrementer" ref="stepIncrementer" />
|
||||
<property name="stepExecutionIncrementer" ref="stepExecutionIncrementer" />
|
||||
<property name="stepExecutionIncrementer" ref="stepExecutionIncrementer" />
|
||||
<property name="jobDao" ref="jobDao"/>
|
||||
</bean>
|
||||
|
||||
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
|
||||
|
||||
Reference in New Issue
Block a user