IN PROGRESS - issue BATCH-340: Refactor JobRepository for greater clarity and consistency.

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

JdbcJobInstanceDao no longer depends on JobExecutionDao, removed JOB_INSTANCE.LAST_EXECUTION column from db schema
This commit is contained in:
robokaso
2008-02-14 13:01:27 +00:00
parent 2801a89b0f
commit 803a69aaef
18 changed files with 87 additions and 196 deletions

View File

@@ -177,13 +177,23 @@ public class SimpleJobRepository implements JobRepository {
throw new BatchRestartException("Restart Max exceeded for Job: " + jobInstance.toString());
}
List executions = jobExecutionDao.findJobExecutions(jobInstance);
JobExecution lastExecution = null;
// check for running executions and find the last started
for (Iterator iterator = executions.iterator(); iterator.hasNext();) {
JobExecution execution = (JobExecution) iterator.next();
if (lastExecution == null) {
lastExecution = execution;
}
if (lastExecution.getStartTime().getTime() < execution.getStartTime().getTime()) {
lastExecution = execution;
}
if (execution.isRunning()) {
throw new JobExecutionAlreadyRunningException("A job execution for this job is already running: "
+ jobInstance);
}
}
jobInstance.setLastExecution(lastExecution);
}
else if (jobs.size() == 0) {
// no job found, create one
@@ -242,12 +252,7 @@ public class SimpleJobRepository implements JobRepository {
* @throws IllegalArgumentException if Job or it's Id is null.
*/
public void update(JobInstance job) {
Assert.notNull(job, "Job cannot be null.");
Assert.notNull(job.getId(), "Job cannot be updated if it's ID is null. It must be obtained"
+ "from SimpleJobRepository.findOrCreateJob to be considered valid.");
jobInstanceDao.updateJobInstance(job);
//TODO no-op to be removed
}
/**

View File

@@ -34,22 +34,22 @@ import org.springframework.util.Assert;
public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements JobExecutionDao, InitializingBean {
private static final Log logger = LogFactory.getLog(JdbcJobExecutionDao.class);
private static final int EXIT_MESSAGE_LENGTH = 250;
private static final String GET_JOB_EXECUTION_COUNT = "SELECT count(JOB_EXECUTION_ID) from %PREFIX%JOB_EXECUTION "
+ "where JOB_INSTANCE_ID = ?";
+ "where JOB_INSTANCE_ID = ?";
private static final String SAVE_JOB_EXECUTION = "INSERT into %PREFIX%JOB_EXECUTION(JOB_EXECUTION_ID, JOB_INSTANCE_ID, START_TIME, "
+ "END_TIME, STATUS, CONTINUABLE, EXIT_CODE, EXIT_MESSAGE) values (?, ?, ?, ?, ?, ?, ?, ?)";
+ "END_TIME, STATUS, CONTINUABLE, EXIT_CODE, EXIT_MESSAGE) values (?, ?, ?, ?, ?, ?, ?, ?)";
private static final String CHECK_JOB_EXECUTION_EXISTS = "SELECT COUNT(*) FROM %PREFIX%JOB_EXECUTION WHERE JOB_EXECUTION_ID = ?";
private static final String UPDATE_JOB_EXECUTION = "UPDATE %PREFIX%JOB_EXECUTION set START_TIME = ?, END_TIME = ?, "
+ " STATUS = ?, CONTINUABLE = ?, EXIT_CODE = ?, EXIT_MESSAGE = ? where JOB_EXECUTION_ID = ?";
+ " STATUS = ?, CONTINUABLE = ?, EXIT_CODE = ?, EXIT_MESSAGE = ? where JOB_EXECUTION_ID = ?";
private DataFieldMaxValueIncrementer jobExecutionIncrementer;
public List findJobExecutions(final JobInstance job) {
Assert.notNull(job, "Job cannot be null.");
@@ -83,8 +83,7 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
/**
* @see JobDao#getJobExecutionCount(JobInstance)
* @throws IllegalArgumentException
* if jobId is null.
* @throws IllegalArgumentException if jobId is null.
*/
public int getJobExecutionCount(Long jobId) {
@@ -92,8 +91,7 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
Object[] parameters = new Object[] { jobId };
return getJdbcTemplate()
.queryForInt(getQuery(GET_JOB_EXECUTION_COUNT), parameters);
return getJdbcTemplate().queryForInt(getQuery(GET_JOB_EXECUTION_COUNT), parameters);
}
/**
@@ -103,41 +101,38 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
* via a SQL INSERT statement.
*
* @see JobDao#saveJobExecution(JobExecution)
* @throws IllegalArgumentException
* if jobExecution is null, as well as any of it's fields to be
* persisted.
* @throws IllegalArgumentException if jobExecution is null, as well as any
* of it's fields to be persisted.
*/
public void saveJobExecution(JobExecution jobExecution) {
validateJobExecution(jobExecution);
jobExecution.setId(new Long(jobExecutionIncrementer.nextLongValue()));
Object[] parameters = new Object[] { jobExecution.getId(),
jobExecution.getJobId(), jobExecution.getStartTime(),
jobExecution.getEndTime(), jobExecution.getStatus().toString(),
jobExecution.getExitStatus().isContinuable() ? "Y" : "N",
jobExecution.getExitStatus().getExitCode(),
Object[] parameters = new Object[] { jobExecution.getId(), jobExecution.getJobId(),
jobExecution.getStartTime(), jobExecution.getEndTime(), jobExecution.getStatus().toString(),
jobExecution.getExitStatus().isContinuable() ? "Y" : "N", jobExecution.getExitStatus().getExitCode(),
jobExecution.getExitStatus().getExitDescription() };
getJdbcTemplate().update(getQuery(SAVE_JOB_EXECUTION), parameters, new int[] {
Types.INTEGER, Types.INTEGER, Types.TIMESTAMP, Types.TIMESTAMP,
Types.VARCHAR, Types.CHAR, Types.VARCHAR, Types.VARCHAR });
getJdbcTemplate().update(
getQuery(SAVE_JOB_EXECUTION),
parameters,
new int[] { Types.INTEGER, Types.INTEGER, Types.TIMESTAMP, Types.TIMESTAMP, Types.VARCHAR, Types.CHAR,
Types.VARCHAR, Types.VARCHAR });
}
/**
* Validate JobExecution. At a minimum, JobId, StartTime, EndTime, and
* Status cannot be null.
*
* @param jobExecution @throws IllegalArgumentException
* @param jobExecution
* @throws IllegalArgumentException
*/
private void validateJobExecution(JobExecution jobExecution) {
Assert.notNull(jobExecution);
Assert.notNull(jobExecution.getJobId(),
"JobExecution Job-Id cannot be null.");
Assert.notNull(jobExecution.getStartTime(),
"JobExecution start time cannot be null.");
Assert.notNull(jobExecution.getStatus(),
"JobExecution status cannot be null.");
Assert.notNull(jobExecution.getJobId(), "JobExecution Job-Id cannot be null.");
Assert.notNull(jobExecution.getStartTime(), "JobExecution start time cannot be null.");
Assert.notNull(jobExecution.getStatus(), "JobExecution status cannot be null.");
}
/**
@@ -152,56 +147,45 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
validateJobExecution(jobExecution);
String exitDescription = jobExecution.getExitStatus()
.getExitDescription();
if (exitDescription != null
&& exitDescription.length() > EXIT_MESSAGE_LENGTH) {
String exitDescription = jobExecution.getExitStatus().getExitDescription();
if (exitDescription != null && exitDescription.length() > EXIT_MESSAGE_LENGTH) {
exitDescription = exitDescription.substring(0, EXIT_MESSAGE_LENGTH);
logger
.debug("Truncating long message before update of JobExecution: "
+ jobExecution);
logger.debug("Truncating long message before update of JobExecution: " + jobExecution);
}
Object[] parameters = new Object[] { jobExecution.getStartTime(),
jobExecution.getEndTime(), jobExecution.getStatus().toString(),
jobExecution.getExitStatus().isContinuable() ? "Y" : "N",
jobExecution.getExitStatus().getExitCode(), exitDescription,
jobExecution.getId() };
Object[] parameters = new Object[] { jobExecution.getStartTime(), jobExecution.getEndTime(),
jobExecution.getStatus().toString(), jobExecution.getExitStatus().isContinuable() ? "Y" : "N",
jobExecution.getExitStatus().getExitCode(), exitDescription, jobExecution.getId() };
if (jobExecution.getId() == null) {
throw new IllegalArgumentException(
"JobExecution ID cannot be null. JobExecution must be saved "
+ "before it can be updated.");
throw new IllegalArgumentException("JobExecution ID cannot be null. JobExecution must be saved "
+ "before it can be updated.");
}
// Check if given JobExecution's Id already exists, if none is found it
// is invalid and
// an exception should be thrown.
if (getJdbcTemplate().queryForInt(getQuery(CHECK_JOB_EXECUTION_EXISTS),
new Object[] { jobExecution.getId() }) != 1) {
throw new NoSuchBatchDomainObjectException(
"Invalid JobExecution, ID " + jobExecution.getId()
+ " not found.");
if (getJdbcTemplate().queryForInt(getQuery(CHECK_JOB_EXECUTION_EXISTS), new Object[] { jobExecution.getId() }) != 1) {
throw new NoSuchBatchDomainObjectException("Invalid JobExecution, ID " + jobExecution.getId()
+ " not found.");
}
getJdbcTemplate()
.update(getQuery(UPDATE_JOB_EXECUTION), parameters,
new int[] { Types.TIMESTAMP, Types.TIMESTAMP,
Types.VARCHAR, Types.CHAR, Types.VARCHAR,
Types.VARCHAR, Types.INTEGER });
getJdbcTemplate().update(
getQuery(UPDATE_JOB_EXECUTION),
parameters,
new int[] { Types.TIMESTAMP, Types.TIMESTAMP, Types.VARCHAR, Types.CHAR, Types.VARCHAR, Types.VARCHAR,
Types.INTEGER });
}
/**
* Setter for {@link DataFieldMaxValueIncrementer} to be used when
* generating primary keys for {@link JobExecution} instances.
*
* @param jobExecutionIncrementer
* the {@link DataFieldMaxValueIncrementer}
* @param jobExecutionIncrementer the {@link DataFieldMaxValueIncrementer}
*/
public void setJobExecutionIncrementer(
DataFieldMaxValueIncrementer jobExecutionIncrementer) {
public void setJobExecutionIncrementer(DataFieldMaxValueIncrementer jobExecutionIncrementer) {
this.jobExecutionIncrementer = jobExecutionIncrementer;
}
public void afterPropertiesSet() throws Exception {
super.afterPropertiesSet();
Assert.notNull(jobExecutionIncrementer);

View File

@@ -9,7 +9,6 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.springframework.batch.core.domain.JobExecution;
import org.springframework.batch.core.domain.JobInstance;
import org.springframework.batch.core.domain.JobParameters;
import org.springframework.beans.factory.InitializingBean;
@@ -38,13 +37,9 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
private static final String CREATE_JOB_PARAMETERS = "INSERT into %PREFIX%JOB_PARAMS(JOB_INSTANCE_ID, KEY_NAME, TYPE_CD, "
+ "STRING_VAL, DATE_VAL, LONG_VAL) values (?, ?, ?, ?, ?, ?)";
private static final String FIND_JOBS = "SELECT JOB_INSTANCE_ID, LAST_JOB_EXECUTION_ID from %PREFIX%JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?";
private static final String UPDATE_JOB = "UPDATE %PREFIX%JOB_INSTANCE set LAST_JOB_EXECUTION_ID = ? where JOB_INSTANCE_ID = ?";
private static final String FIND_JOBS = "SELECT JOB_INSTANCE_ID from %PREFIX%JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?";
private DataFieldMaxValueIncrementer jobIncrementer;
private JobExecutionDao jobExecutionDao;
/**
* In this jdbc implementation a job id is obtained by asking the
@@ -146,27 +141,19 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
* given identifier, adding them to a list via the RowMapper callback.
*
* @see JobDao#findJobInstances(JobIdentifier)
* @throws IllegalArgumentException
* if any {@link JobIdentifier} fields are null.
* @throws IllegalArgumentException if any {@link JobIdentifier} fields are
* null.
*/
public List findJobInstances(final String jobName, final JobParameters jobParameters) {
Assert.notNull(jobName, "Job Name must not be null.");
Assert.notNull(jobParameters, "JobParameters must not be null.");
Object[] parameters = new Object[] { jobName,
createJobKey(jobParameters) };
Object[] parameters = new Object[] { jobName, createJobKey(jobParameters) };
RowMapper rowMapper = new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
JobInstance jobInstance = new JobInstance(new Long(rs.getLong(1)), jobParameters);
long lastExecutionId = rs.getLong(2);
JobExecution lastExecution = jobExecutionDao.getJobExecution(new Long(lastExecutionId));
if(lastExecution != null){
lastExecution.setJobInstance(jobInstance);
}
jobInstance.setLastExecution(lastExecution);
return jobInstance;
}
};
@@ -174,22 +161,6 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
return getJdbcTemplate().query(getQuery(FIND_JOBS), parameters, rowMapper);
}
/**
* @see JobDao#updateJobInstance(JobInstance)
* @throws IllegalArgumentException
* if Job, Job.status, or job.id is null
*/
public void updateJobInstance(JobInstance jobInstance) {
Assert.notNull(jobInstance, "Job Cannot be Null");
Assert.notNull(jobInstance.getId(), "Job ID cannot be null");
Long lastExecutionId = jobInstance.getLastExecution() == null ? null : jobInstance.getLastExecution().getId();
Object[] parameters = new Object[] { lastExecutionId, jobInstance.getId() };
getJdbcTemplate().update(getQuery(UPDATE_JOB), parameters, new int[] {
Types.INTEGER, Types.INTEGER});
}
/**
* Setter for {@link DataFieldMaxValueIncrementer} to be used when
* generating primary keys for {@link JobInstance} instances.
@@ -199,18 +170,12 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
public void setJobIncrementer(DataFieldMaxValueIncrementer jobIncrementer) {
this.jobIncrementer = jobIncrementer;
}
public void setJobExecutionDao(JobExecutionDao jobExecutionDao) {
this.jobExecutionDao = jobExecutionDao;
}
public void afterPropertiesSet() throws Exception {
super.afterPropertiesSet();
Assert.notNull(jobExecutionDao);
Assert.notNull(jobIncrementer);
}
private static class ParameterType {
private final String type;

View File

@@ -180,7 +180,7 @@ public class JdbcStepExecutionDao extends AbstractJdbcBatchMetadataDao
List executions = getJdbcTemplate().query(getQuery(FIND_LAST_STEP_EXECUTION),
new Object[] { stepInstanceId, stepInstanceId }, new StepExecutionRowMapper(stepInstance));
Assert.state(executions.size() <= 1, "There must be at most one latest execution");
Assert.state(executions.size() <= 1, "There must be at most one latest step execution");
if (executions.size() == 0) {
return null;

View File

@@ -58,4 +58,9 @@ public interface JobExecutionDao {
* execution is found for the given id.
*/
JobExecution getJobExecution(Long jobExecutionId);
// /**
// * @return return the last execution for the given instance
// */
// JobExecution getLastJobExecution(JobInstance jobInstance);
}

View File

@@ -38,12 +38,4 @@ public interface JobInstanceDao {
*/
List findJobInstances(String jobName, JobParameters jobParameters);
/**
* Update an existing JobInstance.
*
* Preconditions: jobInstance must have an ID.
*
* @param jobInstance
*/
void updateJobInstance(JobInstance jobInstance);
}

View File

@@ -16,8 +16,7 @@ CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID BIGINT PRIMARY KEY ,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_KEY VARCHAR(250) ,
LAST_JOB_EXECUTION_ID BIGINT );
JOB_KEY VARCHAR(250));
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID BIGINT PRIMARY KEY ,

View File

@@ -16,8 +16,7 @@ CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_KEY VARCHAR(250) ,
LAST_JOB_EXECUTION_ID BIGINT );
JOB_KEY VARCHAR(250));
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,

View File

@@ -16,8 +16,7 @@ CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID BIGINT IDENTITY PRIMARY KEY ,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_KEY VARCHAR(250) ,
LAST_JOB_EXECUTION_ID BIGINT );
JOB_KEY VARCHAR(250));
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID BIGINT IDENTITY PRIMARY KEY ,

View File

@@ -16,8 +16,7 @@ CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID BIGINT unsigned PRIMARY KEY ,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_KEY VARCHAR(250) ,
LAST_JOB_EXECUTION_ID BIGINT );
JOB_KEY VARCHAR(250));
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID BIGINT unsigned PRIMARY KEY ,

View File

@@ -16,8 +16,7 @@ CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID NUMBER(38) PRIMARY KEY ,
VERSION NUMBER(38),
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_KEY VARCHAR(250) ,
LAST_JOB_EXECUTION_ID BIGINT );
JOB_KEY VARCHAR(250));
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID NUMBER(38) PRIMARY KEY ,

View File

@@ -16,8 +16,7 @@ CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID BIGINT PRIMARY KEY ,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_KEY VARCHAR(250) ,
LAST_JOB_EXECUTION_ID BIGINT );
JOB_KEY VARCHAR(250));
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID BIGINT PRIMARY KEY ,

View File

@@ -3,8 +3,7 @@ CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID ${BIGINT} $!{IDENTITY} PRIMARY KEY $!{GENERATED},
VERSION ${BIGINT},
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_KEY VARCHAR(250) ,
LAST_JOB_EXECUTION_ID BIGINT );
JOB_KEY VARCHAR(250));
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID ${BIGINT} $!{IDENTITY} PRIMARY KEY $!{GENERATED},

View File

@@ -197,7 +197,6 @@ public class SimpleJobRepositoryTests extends TestCase {
jobDaoControl.setReturnValue(1);
jobDao.findJobExecutions(databaseJob);
jobDaoControl.setReturnValue(executions);
jobDao.updateJobInstance(databaseJob);
jobDao.saveJobExecution(new JobExecution(databaseJob));
jobDaoControl.setMatcher(new ArgumentsMatcher() {
public boolean matches(Object[] expected, Object[] actual) {
@@ -326,26 +325,6 @@ public class SimpleJobRepositoryTests extends TestCase {
assertTrue(step.equals(databaseStep2));
}
public void testUpdateJob() {
// failure scenario - no ID
JobInstance updateJob;
try {
updateJob = new JobInstance(null, jobParameters);
jobRepository.update(updateJob);
fail();
}
catch (Exception ex) {
// expected
}
// successful update
updateJob = new JobInstance(new Long(0L), jobParameters);
jobDao.updateJobInstance(updateJob);
jobDaoControl.replay();
jobRepository.update(updateJob);
}
public void testSaveOrUpdateInvalidJobExecution() {
@@ -501,8 +480,6 @@ public class SimpleJobRepositoryTests extends TestCase {
jobDaoControl.setReturnValue(1);
jobDao.findJobExecutions(databaseJob);
jobDaoControl.setReturnValue(new ArrayList());
jobDao.updateJobInstance(databaseJob);
jobDaoControl.setVoidCallable();
jobDao.saveJobExecution(new JobExecution(databaseJob));
jobDaoControl.setMatcher(new ArgumentsMatcher() {
public boolean matches(Object[] expected, Object[] actual) {

View File

@@ -22,11 +22,11 @@ import java.util.Map;
import org.springframework.batch.core.domain.BatchStatus;
import org.springframework.batch.core.domain.Job;
import org.springframework.batch.core.domain.JobSupport;
import org.springframework.batch.core.domain.JobExecution;
import org.springframework.batch.core.domain.JobInstance;
import org.springframework.batch.core.domain.JobParameters;
import org.springframework.batch.core.domain.JobParametersBuilder;
import org.springframework.batch.core.domain.JobSupport;
import org.springframework.batch.core.repository.NoSuchBatchDomainObjectException;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
@@ -87,7 +87,6 @@ public abstract class AbstractJobDaoTests extends
jobExecution.setStatus(BatchStatus.STARTED);
jobExecutionDao.saveJobExecution(jobExecution);
jobInstance.setLastExecution(jobExecution);
jobInstanceDao.updateJobInstance(jobInstance);
}
public void testVersionIsNotNullForJob() throws Exception {
@@ -153,21 +152,6 @@ public abstract class AbstractJobDaoTests extends
assertEquals(0, jobs.size());
}
public void testUpdateJob() {
// Update the returned job with a new status
JobExecution newExecution = new JobExecution(jobInstance);
jobExecutionDao.saveJobExecution(newExecution);
jobInstance.setLastExecution(newExecution);
jobInstanceDao.updateJobInstance(jobInstance);
// The job just updated should be found, with the saved status.
List jobs = jobInstanceDao.findJobInstances(job.getName(), jobParameters);
assertTrue(jobs.size() == 1);
JobInstance tempJob = (JobInstance) jobs.get(0);
assertTrue(jobInstance.equals(tempJob));
assertEquals(newExecution, tempJob.getLastExecution());
}
public void testGetJobExecution(){
@@ -181,27 +165,6 @@ public abstract class AbstractJobDaoTests extends
assertEquals(lastJobExecution, jobExecution);
}
public void testUpdateJobWithNullId() {
try {
JobInstance testJob = new JobInstance(null, null);
jobInstanceDao.updateJobInstance(testJob);
fail();
} catch (IllegalArgumentException ex) {
// expected
}
}
public void testUpdateNullJob() {
JobInstance testJob = null;
try {
jobInstanceDao.updateJobInstance(testJob);
} catch (IllegalArgumentException ex) {
// expected
}
}
public void testUpdateJobExecution() {
@@ -312,4 +275,14 @@ public abstract class AbstractJobDaoTests extends
assertEquals(lhs.getExitStatus(), rhs.getExitStatus());
}
// public void testGetLastJobExecution() {
// JobExecution lastExecution = new JobExecution(jobInstance);
// lastExecution.setStatus(BatchStatus.STARTED);
//
// int JUMP_INTO_FUTURE = 1000; // makes sure start time is 'greatest'
// lastExecution.setStartTime(new Date(System.currentTimeMillis() + JUMP_INTO_FUTURE));
// jobExecutionDao.saveJobExecution(lastExecution);
//
// assertEquals(lastExecution, jobExecutionDao.getLastJobExecution(jobInstance));
// }
}

View File

@@ -3,8 +3,7 @@ CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID BIGINT IDENTITY PRIMARY KEY ,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_KEY VARCHAR(250) ,
LAST_JOB_EXECUTION_ID BIGINT );
JOB_KEY VARCHAR(250));
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID BIGINT IDENTITY PRIMARY KEY ,

View File

@@ -7,8 +7,7 @@
<bean id="jobInstanceDao" class="org.springframework.batch.execution.repository.dao.JdbcJobInstanceDao" >
<property name="jdbcTemplate" ref="jdbcTemplate" />
<property name="jobIncrementer" ref="jobIncrementer" />
<property name="jobExecutionDao" ref="jobExecutionDao" />
<property name="jobIncrementer" ref="jobIncrementer" />
</bean>
<bean id="jobExecutionDao" class="org.springframework.batch.execution.repository.dao.JdbcJobExecutionDao" >

View File

@@ -54,8 +54,7 @@
<bean id="jobInstanceDao" lazy-init="true"
class="org.springframework.batch.execution.repository.dao.JdbcJobInstanceDao">
<property name="jdbcTemplate" ref="jdbcTemplate" />
<property name="jobIncrementer" ref="jobIncrementer" />
<property name="jobExecutionDao" ref="jobExecutionDao" />
<property name="jobIncrementer" ref="jobIncrementer" />
</bean>
<bean id="jobExecutionDao" lazy-init="true"