IN PROGRESS - issue BATCH-384: consolidate map dao implementations
http://jira.springframework.org/browse/BATCH-384 MapJobDao split to MapJobInstanceDao and MapJobExecutionDao. JobInstanceDao now has getJobInstance(Job,Params) rather than findJobInstances(Job,Params)
This commit is contained in:
@@ -145,7 +145,6 @@ public class SimpleJobRepository implements JobRepository {
|
||||
Assert.notNull(job, "Job must not be null.");
|
||||
Assert.notNull(jobParameters, "JobParameters must not be null.");
|
||||
|
||||
List jobInstances = new ArrayList();
|
||||
JobInstance jobInstance;
|
||||
|
||||
/*
|
||||
@@ -157,15 +156,14 @@ public class SimpleJobRepository implements JobRepository {
|
||||
* has finished.
|
||||
*/
|
||||
|
||||
jobInstances = jobInstanceDao.findJobInstances(job, jobParameters);
|
||||
|
||||
if ((jobInstances.size() > 0) && (job.isRestartable() == false)) {
|
||||
throw new BatchRestartException("JobInstance already exists and is not restartable");
|
||||
}
|
||||
jobInstance = jobInstanceDao.getJobInstance(job, jobParameters);
|
||||
|
||||
if (jobInstances.size() == 1) {
|
||||
// One job was found
|
||||
jobInstance = (JobInstance) jobInstances.get(0);
|
||||
// existing job instance found
|
||||
if (jobInstance != null) {
|
||||
if (!job.isRestartable()) {
|
||||
throw new BatchRestartException("JobInstance already exists and is not restartable");
|
||||
}
|
||||
|
||||
jobInstance.setJobExecutionCount(jobExecutionDao.getJobExecutionCount(jobInstance));
|
||||
if (jobInstance.getJobExecutionCount() > job.getStartLimit()) {
|
||||
throw new BatchRestartException("Restart Max exceeded for Job: " + jobInstance.toString());
|
||||
@@ -190,15 +188,10 @@ public class SimpleJobRepository implements JobRepository {
|
||||
}
|
||||
jobInstance.setLastExecution(lastExecution);
|
||||
}
|
||||
else if (jobInstances.size() == 0) {
|
||||
else {
|
||||
// no job found, create one
|
||||
jobInstance = jobInstanceDao.createJobInstance(job, jobParameters);
|
||||
}
|
||||
else {
|
||||
// More than one job found, throw exception
|
||||
throw new BatchRestartException("Error restarting job, more than one JobInstance found for: "
|
||||
+ job.toString());
|
||||
}
|
||||
|
||||
return generateJobExecution(jobInstance);
|
||||
|
||||
|
||||
@@ -158,7 +158,7 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
|
||||
* @throws IllegalArgumentException if any {@link JobIdentifier} fields are
|
||||
* null.
|
||||
*/
|
||||
public List findJobInstances(final Job job, final JobParameters jobParameters) {
|
||||
public JobInstance getJobInstance(final Job job, final JobParameters jobParameters) {
|
||||
|
||||
Assert.notNull(job, "Job must not be null.");
|
||||
Assert.hasLength(job.getName(), "Job must have a name");
|
||||
@@ -172,8 +172,15 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
|
||||
return jobInstance;
|
||||
}
|
||||
};
|
||||
|
||||
return getJdbcTemplate().query(getQuery(FIND_JOBS), parameters, rowMapper);
|
||||
|
||||
List instances = getJdbcTemplate().query(getQuery(FIND_JOBS), parameters, rowMapper);
|
||||
|
||||
if (instances.isEmpty()) {
|
||||
return null;
|
||||
} else {
|
||||
Assert.state(instances.size() == 1);
|
||||
return (JobInstance) instances.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -37,6 +37,6 @@ public interface JobInstanceDao {
|
||||
* @return List of {@link JobInstance} objects matching
|
||||
* {@link JobIdentifier}
|
||||
*/
|
||||
List findJobInstances(Job job, JobParameters jobParameters);
|
||||
JobInstance getJobInstance(Job job, JobParameters jobParameters);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
/*
|
||||
* Copyright 2006-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.batch.execution.repository.dao;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.batch.core.domain.Job;
|
||||
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.support.transaction.TransactionAwareProxyFactory;
|
||||
|
||||
public class MapJobDao implements JobInstanceDao, JobExecutionDao {
|
||||
|
||||
private static Map jobsById;
|
||||
private static Map executionsById;
|
||||
|
||||
private long currentId = 0;
|
||||
|
||||
static {
|
||||
jobsById = TransactionAwareProxyFactory.createTransactionalMap();
|
||||
executionsById = TransactionAwareProxyFactory.createTransactionalMap();
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
jobsById.clear();
|
||||
executionsById.clear();
|
||||
}
|
||||
|
||||
public JobInstance createJobInstance(Job job, JobParameters jobParameters) {
|
||||
JobInstance jobInstance = new JobInstance(new Long(currentId++), jobParameters, job);
|
||||
|
||||
jobsById.put(jobInstance.getId(), jobInstance);
|
||||
return jobInstance;
|
||||
}
|
||||
|
||||
public List findJobInstances(Job job, JobParameters jobParameters) {
|
||||
List list = new ArrayList();
|
||||
for (Iterator iter = jobsById.values().iterator(); iter.hasNext();) {
|
||||
JobInstance jobInstance = (JobInstance) iter.next();
|
||||
if (jobInstance.getJobName().equals(job.getName()) && jobInstance.getJobParameters().equals(jobParameters)) {
|
||||
list.add(jobInstance);
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public int getJobExecutionCount(JobInstance jobInstance) {
|
||||
Set executions = (Set) executionsById.get(jobInstance.getId());
|
||||
if (executions==null) return 0;
|
||||
return executions.size(); }
|
||||
|
||||
public void saveJobExecution(JobExecution jobExecution) {
|
||||
Set executions = (Set) executionsById.get(jobExecution.getJobId());
|
||||
if (executions==null) {
|
||||
executions = TransactionAwareProxyFactory.createTransactionalSet();
|
||||
executionsById.put(jobExecution.getJobId(), executions);
|
||||
}
|
||||
executions.add(jobExecution);
|
||||
jobExecution.setId(new Long(currentId++));
|
||||
}
|
||||
|
||||
public List findJobExecutions(JobInstance jobInstance) {
|
||||
Set executions = (Set) executionsById.get(jobInstance.getId());
|
||||
if( executions == null ){
|
||||
return new ArrayList();
|
||||
}
|
||||
else{
|
||||
return new ArrayList(executions);
|
||||
}
|
||||
}
|
||||
|
||||
public void updateJobExecution(JobExecution jobExecution) {
|
||||
// no-op
|
||||
}
|
||||
|
||||
public JobExecution getLastJobExecution(JobInstance jobInstance) {
|
||||
// no-op
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
package org.springframework.batch.execution.repository.dao;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
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.support.transaction.TransactionAwareProxyFactory;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
public class MapJobExecutionDao implements JobExecutionDao {
|
||||
|
||||
private static Map executionsByJobInstanceId = TransactionAwareProxyFactory.createTransactionalMap();
|
||||
|
||||
private static long currentId;
|
||||
|
||||
public static void clear() {
|
||||
executionsByJobInstanceId.clear();
|
||||
}
|
||||
|
||||
public int getJobExecutionCount(JobInstance jobInstance) {
|
||||
Set executions = (Set) executionsByJobInstanceId.get(jobInstance.getId());
|
||||
if (executions == null)
|
||||
return 0;
|
||||
return executions.size();
|
||||
}
|
||||
|
||||
public void saveJobExecution(JobExecution jobExecution) {
|
||||
Set executions = (Set) executionsByJobInstanceId.get(jobExecution.getJobId());
|
||||
if (executions == null) {
|
||||
executions = TransactionAwareProxyFactory.createTransactionalSet();
|
||||
executionsByJobInstanceId.put(jobExecution.getJobId(), executions);
|
||||
}
|
||||
executions.add(jobExecution);
|
||||
jobExecution.setId(new Long(currentId++));
|
||||
}
|
||||
|
||||
public List findJobExecutions(JobInstance jobInstance) {
|
||||
Set executions = (Set) executionsByJobInstanceId.get(jobInstance.getId());
|
||||
if (executions == null) {
|
||||
return new ArrayList();
|
||||
}
|
||||
else {
|
||||
return new ArrayList(executions);
|
||||
}
|
||||
}
|
||||
|
||||
public void updateJobExecution(JobExecution jobExecution) {
|
||||
Assert.notNull(jobExecution.getJobId());
|
||||
}
|
||||
|
||||
public JobExecution getLastJobExecution(JobInstance jobInstance) {
|
||||
Assert.notNull(jobInstance.getId());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package org.springframework.batch.execution.repository.dao;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
|
||||
import org.springframework.batch.core.domain.Job;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.JobParameters;
|
||||
import org.springframework.batch.support.transaction.TransactionAwareProxyFactory;
|
||||
|
||||
public class MapJobInstanceDao implements JobInstanceDao {
|
||||
|
||||
private static Collection jobInstances = TransactionAwareProxyFactory.createTransactionalList();
|
||||
|
||||
private long currentId = 0;
|
||||
|
||||
public static void clear() {
|
||||
jobInstances.clear();
|
||||
}
|
||||
|
||||
public JobInstance createJobInstance(Job job, JobParameters jobParameters) {
|
||||
|
||||
if (getJobInstance(job, jobParameters) != null) {
|
||||
throw new IllegalArgumentException("JobInstance already exists for given job and parameters");
|
||||
}
|
||||
|
||||
JobInstance jobInstance = new JobInstance(new Long(currentId++), jobParameters, job);
|
||||
jobInstances.add(jobInstance);
|
||||
|
||||
return jobInstance;
|
||||
}
|
||||
|
||||
public JobInstance getJobInstance(Job job, JobParameters jobParameters) {
|
||||
|
||||
for (Iterator iterator = jobInstances.iterator(); iterator.hasNext();) {
|
||||
JobInstance instance = (JobInstance) iterator.next();
|
||||
if (instance.getJobName().equals(job.getName()) && instance.getJobParameters().equals(jobParameters)) {
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -30,11 +30,11 @@ import org.springframework.batch.core.domain.Step;
|
||||
import org.springframework.batch.core.domain.StepExecution;
|
||||
import org.springframework.batch.core.repository.JobRepository;
|
||||
import org.springframework.batch.core.runtime.ExitStatusExceptionClassifier;
|
||||
import org.springframework.batch.execution.job.SimpleJob;
|
||||
import org.springframework.batch.execution.repository.SimpleJobRepository;
|
||||
import org.springframework.batch.execution.repository.dao.JobExecutionDao;
|
||||
import org.springframework.batch.execution.repository.dao.JobInstanceDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapJobDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapJobExecutionDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapJobInstanceDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapStepDao;
|
||||
import org.springframework.batch.execution.repository.dao.StepExecutionDao;
|
||||
import org.springframework.batch.execution.step.AbstractStep;
|
||||
@@ -83,10 +83,11 @@ public class SimpleJobTests extends TestCase {
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
|
||||
MapJobDao.clear();
|
||||
MapJobInstanceDao.clear();
|
||||
MapJobExecutionDao.clear();
|
||||
MapStepDao.clear();
|
||||
jobInstanceDao = new MapJobDao();
|
||||
jobExecutionDao = new MapJobDao();
|
||||
jobInstanceDao = new MapJobInstanceDao();
|
||||
jobExecutionDao = new MapJobExecutionDao();
|
||||
stepExecutionDao = new MapStepDao();
|
||||
jobRepository = new SimpleJobRepository(jobInstanceDao, jobExecutionDao, stepExecutionDao);
|
||||
job = new SimpleJob();
|
||||
@@ -255,7 +256,7 @@ public class SimpleJobTests extends TestCase {
|
||||
* Check JobRepository to ensure status is being saved.
|
||||
*/
|
||||
private void checkRepository(BatchStatus status, ExitStatus exitStatus) {
|
||||
assertEquals(jobInstance, jobInstanceDao.findJobInstances(jobInstance.getJob(), jobParameters).get(0));
|
||||
assertEquals(jobInstance, jobInstanceDao.getJobInstance(jobInstance.getJob(), jobParameters));
|
||||
// because map dao stores in memory, it can be checked directly
|
||||
JobExecution jobExecution = (JobExecution) jobExecutionDao.findJobExecutions(jobInstance).get(0);
|
||||
assertEquals(jobInstance.getId(), jobExecution.getJobId());
|
||||
|
||||
@@ -30,7 +30,8 @@ import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.JobParameters;
|
||||
import org.springframework.batch.execution.job.SimpleJob;
|
||||
import org.springframework.batch.execution.repository.SimpleJobRepository;
|
||||
import org.springframework.batch.execution.repository.dao.MapJobDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapJobExecutionDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapJobInstanceDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapStepDao;
|
||||
import org.springframework.batch.execution.step.AbstractStep;
|
||||
import org.springframework.batch.execution.step.ItemOrientedStep;
|
||||
@@ -48,7 +49,7 @@ public class SimpleJobTests extends TestCase {
|
||||
|
||||
private List recovered = new ArrayList();
|
||||
|
||||
private SimpleJobRepository repository = new SimpleJobRepository(new MapJobDao(), new MapJobDao(), new MapStepDao());
|
||||
private SimpleJobRepository repository = new SimpleJobRepository(new MapJobInstanceDao(), new MapJobExecutionDao(), new MapStepDao());
|
||||
|
||||
private List processed = new ArrayList();
|
||||
|
||||
@@ -65,7 +66,8 @@ public class SimpleJobTests extends TestCase {
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
job.setJobRepository(repository);
|
||||
MapJobDao.clear();
|
||||
MapJobInstanceDao.clear();
|
||||
MapJobExecutionDao.clear();
|
||||
MapStepDao.clear();
|
||||
}
|
||||
|
||||
|
||||
@@ -226,36 +226,12 @@ public class SimpleJobRepositoryTests extends TestCase {
|
||||
//// assertTrue(step.getStepExecutionCount() == 1);
|
||||
}
|
||||
|
||||
// Test that a restartable job that has multiple instances throws an
|
||||
// exception.
|
||||
public void testFindRestartableJobWithMultipleInstances() throws Exception {
|
||||
|
||||
List jobs = new ArrayList();
|
||||
jobs.add(databaseJob);
|
||||
jobs.add(new JobInstance(new Long(127), jobParameters, jobConfiguration));
|
||||
jobInstanceDao.findJobInstances(jobConfiguration, jobParameters);
|
||||
jobInstanceDaoControl.setReturnValue(jobs);
|
||||
jobInstanceDaoControl.replay();
|
||||
|
||||
try {
|
||||
jobRepository.createJobExecution(jobConfiguration, jobParameters);
|
||||
fail("Expected BatchRestartException");
|
||||
}
|
||||
catch (BatchRestartException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
jobInstanceDaoControl.verify();
|
||||
}
|
||||
|
||||
public void testRestartJobStartLimitExceeded() throws Exception {
|
||||
|
||||
jobConfiguration.setStartLimit(1);
|
||||
|
||||
List jobs = new ArrayList();
|
||||
jobInstanceDao.findJobInstances(jobConfiguration, jobParameters);
|
||||
jobs.add(databaseJob);
|
||||
jobInstanceDaoControl.setReturnValue(jobs);
|
||||
jobInstanceDao.getJobInstance(jobConfiguration, jobParameters);
|
||||
jobInstanceDaoControl.setReturnValue(databaseJob);
|
||||
jobExecutionDao.getJobExecutionCount(databaseJob);
|
||||
// return a greater execution count then the start limit, should throw
|
||||
// exception
|
||||
|
||||
@@ -99,23 +99,22 @@ public abstract class AbstractJobDaoTests extends AbstractTransactionalDataSourc
|
||||
|
||||
public void testFindNonExistentJob() {
|
||||
// No job should be found since it hasn't been created.
|
||||
List jobs = jobInstanceDao.findJobInstances(new JobSupport("nonexistentJob"), jobParameters);
|
||||
assertTrue(jobs.size() == 0);
|
||||
JobInstance jobInstance = jobInstanceDao.getJobInstance(new JobSupport("nonexistentJob"), jobParameters);
|
||||
assertNull(jobInstance);
|
||||
}
|
||||
|
||||
public void testFindJob() {
|
||||
|
||||
List jobs = jobInstanceDao.findJobInstances(job, jobParameters);
|
||||
assertTrue(jobs.size() == 1);
|
||||
JobInstance tempJob = (JobInstance) jobs.get(0);
|
||||
assertTrue(jobInstance.equals(tempJob));
|
||||
assertEquals(jobParameters, tempJob.getJobParameters());
|
||||
JobInstance instance = jobInstanceDao.getJobInstance(job, jobParameters);
|
||||
assertNotNull(instance);
|
||||
assertTrue(jobInstance.equals(instance));
|
||||
assertEquals(jobParameters, instance.getJobParameters());
|
||||
}
|
||||
|
||||
public void testFindJobWithNullRuntime() {
|
||||
|
||||
try {
|
||||
jobInstanceDao.findJobInstances(null, null);
|
||||
jobInstanceDao.getJobInstance(null, null);
|
||||
fail();
|
||||
}
|
||||
catch (IllegalArgumentException ex) {
|
||||
@@ -137,14 +136,13 @@ public abstract class AbstractJobDaoTests extends AbstractTransactionalDataSourc
|
||||
// JobInstance
|
||||
JobParameters tempProps = new JobParametersBuilder().addString("job.key", "testKey1").toJobParameters();
|
||||
|
||||
List jobs;
|
||||
jobs = jobInstanceDao.findJobInstances(scheduledJob, jobParameters);
|
||||
assertEquals(1, jobs.size());
|
||||
JobInstance jobInstance = (JobInstance) jobs.get(0);
|
||||
assertEquals(jobParameters, jobInstance.getJobParameters());
|
||||
JobInstance instance;
|
||||
instance = jobInstanceDao.getJobInstance(scheduledJob, jobParameters);
|
||||
assertNotNull(instance);
|
||||
assertEquals(jobParameters, instance.getJobParameters());
|
||||
|
||||
jobs = jobInstanceDao.findJobInstances(scheduledJob, tempProps);
|
||||
assertEquals(0, jobs.size());
|
||||
instance = jobInstanceDao.getJobInstance(scheduledJob, tempProps);
|
||||
assertNull(instance);
|
||||
|
||||
}
|
||||
|
||||
@@ -231,10 +229,10 @@ public abstract class AbstractJobDaoTests extends AbstractTransactionalDataSourc
|
||||
// Create job.
|
||||
jobInstance = jobInstanceDao.createJobInstance(testDefaultJob, jobParameters);
|
||||
|
||||
List jobs = jobInstanceDao.findJobInstances(testDefaultJob, jobParameters);
|
||||
JobInstance instance = jobInstanceDao.getJobInstance(testDefaultJob, jobParameters);
|
||||
|
||||
assertEquals(1, jobs.size());
|
||||
assertEquals(jobParameters.getString("job.key"), ((JobInstance) jobs.get(0)).getJobParameters().getString(
|
||||
assertNotNull(instance);
|
||||
assertEquals(jobParameters.getString("job.key"), instance.getJobParameters().getString(
|
||||
"job.key"));
|
||||
|
||||
}
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
/*
|
||||
* Copyright 2006-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.batch.execution.repository.dao;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.batch.core.domain.Job;
|
||||
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.execution.job.JobSupport;
|
||||
|
||||
public class MapJobDaoTests extends TestCase {
|
||||
|
||||
MapJobDao dao = new MapJobDao();
|
||||
|
||||
JobParameters jobParameters = new JobParameters();
|
||||
|
||||
Job fooJob = new JobSupport("foo");
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
MapJobDao.clear();
|
||||
}
|
||||
|
||||
public void testCreateAndRetrieveSingle() throws Exception {
|
||||
JobInstance job = dao.createJobInstance(fooJob, jobParameters);
|
||||
List result = dao.findJobInstances(fooJob, jobParameters);
|
||||
assertTrue(result.contains(job));
|
||||
}
|
||||
|
||||
public void testCreateAndRetrieveMultiple() throws Exception {
|
||||
JobInstance job = dao.createJobInstance(fooJob, jobParameters);
|
||||
Job barJob = new JobSupport("bar");
|
||||
job = dao.createJobInstance(barJob, jobParameters);
|
||||
List result = dao.findJobInstances(barJob, jobParameters);
|
||||
assertEquals(1, result.size());
|
||||
assertTrue(result.contains(job));
|
||||
}
|
||||
|
||||
public void testNoExecutionsForNewJob() throws Exception {
|
||||
JobInstance job = dao.createJobInstance(fooJob, jobParameters);
|
||||
assertEquals(0, dao.getJobExecutionCount(job));
|
||||
}
|
||||
|
||||
public void testSaveExecutionUpdatesId() throws Exception {
|
||||
JobInstance job = dao.createJobInstance(fooJob, jobParameters);
|
||||
JobExecution execution = new JobExecution(job);
|
||||
assertNull(execution.getId());
|
||||
dao.saveJobExecution(execution);
|
||||
assertNotNull(execution.getId());
|
||||
}
|
||||
public void testCorrectExecutionCountForExistingJob() throws Exception {
|
||||
JobInstance job = dao.createJobInstance(fooJob, jobParameters);
|
||||
dao.saveJobExecution(new JobExecution(job));
|
||||
assertEquals(1, dao.getJobExecutionCount(job));
|
||||
}
|
||||
|
||||
public void testMultipleExecutionsPerExisting() throws Exception {
|
||||
JobInstance job = dao.createJobInstance(fooJob, jobParameters);
|
||||
dao.saveJobExecution(new JobExecution(job));
|
||||
Thread.sleep(50L); // Hack, hack, hackety, hack - job executions are not unique if created too close together!
|
||||
dao.saveJobExecution(new JobExecution(job));
|
||||
assertEquals(2, dao.getJobExecutionCount(job));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package org.springframework.batch.execution.repository.dao;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
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.execution.job.JobSupport;
|
||||
|
||||
public class MapJobExecutionDaoTests extends TestCase {
|
||||
|
||||
JobExecutionDao dao = new MapJobExecutionDao();
|
||||
|
||||
JobInstance jobInstance = new JobInstance(new Long(1), new JobParameters(), new JobSupport("execTestJob"));
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
MapJobExecutionDao.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Save and find a job execution.
|
||||
*/
|
||||
public void testSaveAndFind() {
|
||||
JobExecution exec = new JobExecution(jobInstance);
|
||||
dao.saveJobExecution(exec);
|
||||
|
||||
List executions = dao.findJobExecutions(jobInstance);
|
||||
assertTrue(executions.size() == 1);
|
||||
assertEquals(exec, executions.get(0));
|
||||
}
|
||||
|
||||
/**
|
||||
* Saving sets id to the entity.
|
||||
*/
|
||||
public void testSaveAddsId() {
|
||||
JobExecution exec = new JobExecution(jobInstance);
|
||||
assertNull(exec.getId());
|
||||
dao.saveJobExecution(exec);
|
||||
assertNotNull(exec.getId());
|
||||
}
|
||||
/**
|
||||
* Execution count increases by one with every save
|
||||
* for the same job instance.
|
||||
*/
|
||||
public void testGetExecutionCount() {
|
||||
JobExecution exec1 = new JobExecution(jobInstance);
|
||||
JobExecution exec2 = new JobExecution(jobInstance);
|
||||
|
||||
dao.saveJobExecution(exec1);
|
||||
assertEquals(1, dao.getJobExecutionCount(jobInstance));
|
||||
|
||||
dao.saveJobExecution(exec2);
|
||||
assertEquals(2, dao.getJobExecutionCount(jobInstance));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package org.springframework.batch.execution.repository.dao;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.batch.core.domain.Job;
|
||||
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.execution.job.JobSupport;
|
||||
|
||||
public class MapJobInstanceDaoTests extends TestCase {
|
||||
|
||||
JobInstanceDao dao = new MapJobInstanceDao();
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
MapJobInstanceDao.clear();
|
||||
}
|
||||
|
||||
protected void tearDown() throws Exception {
|
||||
MapJobInstanceDao.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create and retrieve a job instance.
|
||||
*/
|
||||
public void testCreateAndRetrieve() throws Exception {
|
||||
Job fooJob = new JobSupport("foo");
|
||||
JobParameters fooParams = new JobParametersBuilder().addString("fooKey", "fooValue").toJobParameters();
|
||||
|
||||
JobInstance fooInstance = dao.createJobInstance(fooJob, fooParams);
|
||||
assertNotNull(fooInstance.getId());
|
||||
assertEquals(fooJob, fooInstance.getJob());
|
||||
assertEquals(fooParams, fooInstance.getJobParameters());
|
||||
|
||||
JobInstance retrievedInstance = dao.getJobInstance(fooJob, fooParams);
|
||||
assertEquals(fooInstance, retrievedInstance);
|
||||
}
|
||||
}
|
||||
@@ -32,7 +32,8 @@ import org.springframework.batch.core.domain.StepContribution;
|
||||
import org.springframework.batch.core.domain.StepExecution;
|
||||
import org.springframework.batch.execution.job.JobSupport;
|
||||
import org.springframework.batch.execution.repository.SimpleJobRepository;
|
||||
import org.springframework.batch.execution.repository.dao.MapJobDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapJobExecutionDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapJobInstanceDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapStepDao;
|
||||
import org.springframework.batch.execution.scope.StepSynchronizationManager;
|
||||
import org.springframework.batch.execution.step.support.JobRepositorySupport;
|
||||
@@ -195,7 +196,7 @@ public class ItemOrientedStepTests extends TestCase {
|
||||
|
||||
public void testRepository() throws Exception {
|
||||
|
||||
SimpleJobRepository repository = new SimpleJobRepository(new MapJobDao(), new MapJobDao(), new MapStepDao());
|
||||
SimpleJobRepository repository = new SimpleJobRepository(new MapJobInstanceDao(), new MapJobExecutionDao(), new MapStepDao());
|
||||
itemOrientedStep.setJobRepository(repository);
|
||||
|
||||
Step step = new StepSupport("stepName");
|
||||
|
||||
@@ -29,7 +29,8 @@ import org.springframework.batch.execution.job.JobSupport;
|
||||
import org.springframework.batch.execution.repository.SimpleJobRepository;
|
||||
import org.springframework.batch.execution.repository.dao.JobExecutionDao;
|
||||
import org.springframework.batch.execution.repository.dao.JobInstanceDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapJobDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapJobExecutionDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapJobInstanceDao;
|
||||
import org.springframework.batch.execution.repository.dao.MapStepDao;
|
||||
import org.springframework.batch.execution.repository.dao.StepExecutionDao;
|
||||
import org.springframework.batch.execution.step.ItemOrientedStep;
|
||||
@@ -44,16 +45,17 @@ public class StepExecutorInterruptionTests extends TestCase {
|
||||
|
||||
private JobRepository jobRepository;
|
||||
|
||||
private JobInstanceDao jobInstanceDao = new MapJobDao();
|
||||
private JobInstanceDao jobInstanceDao = new MapJobInstanceDao();
|
||||
|
||||
private JobExecutionDao jobExecutionDao = new MapJobDao();
|
||||
private JobExecutionDao jobExecutionDao = new MapJobExecutionDao();
|
||||
|
||||
private StepExecutionDao stepExecutionDao = new MapStepDao();
|
||||
|
||||
private ItemOrientedStep step;
|
||||
|
||||
public void setUp() throws Exception {
|
||||
MapJobDao.clear();
|
||||
MapJobInstanceDao.clear();
|
||||
MapJobExecutionDao.clear();
|
||||
MapStepDao.clear();
|
||||
|
||||
jobRepository = new SimpleJobRepository(jobInstanceDao, jobExecutionDao, stepExecutionDao);
|
||||
|
||||
@@ -44,13 +44,17 @@
|
||||
|
||||
<bean id="simpleJobRepository"
|
||||
class="org.springframework.batch.execution.repository.SimpleJobRepository">
|
||||
<constructor-arg ref="jobDao" />
|
||||
<constructor-arg ref="jobDao" />
|
||||
<constructor-arg ref="jobInstanceDao" />
|
||||
<constructor-arg ref="jobExecutionDao" />
|
||||
<constructor-arg ref="stepDao" />
|
||||
</bean>
|
||||
|
||||
<bean id="jobDao"
|
||||
class="org.springframework.batch.execution.repository.dao.MapJobDao" />
|
||||
<bean id="jobInstanceDao"
|
||||
class="org.springframework.batch.execution.repository.dao.MapJobInstanceDao" />
|
||||
<!-- init-method="clear"/-->
|
||||
|
||||
<bean id="jobExecutionDao"
|
||||
class="org.springframework.batch.execution.repository.dao.MapJobExecutionDao" />
|
||||
<!-- init-method="clear"/-->
|
||||
|
||||
<bean id="stepDao"
|
||||
|
||||
@@ -71,10 +71,13 @@
|
||||
ref="stepExecutionIncrementer" />
|
||||
</bean>
|
||||
|
||||
<bean id="mapJobDao" lazy-init="true"
|
||||
class="org.springframework.batch.execution.repository.dao.MapJobDao" />
|
||||
<bean id="mapJobInstanceDao" lazy-init="true"
|
||||
class="org.springframework.batch.execution.repository.dao.MapJobInstanceDao" />
|
||||
|
||||
<bean id="mapJobExecutionDao" lazy-init="true"
|
||||
class="org.springframework.batch.execution.repository.dao.MapJobExecutionDao" />
|
||||
|
||||
<bean id="mapStepDao" lazy-init="true"
|
||||
<bean id="mapStepExecutionDao" lazy-init="true"
|
||||
class="org.springframework.batch.execution.repository.dao.MapStepDao" />
|
||||
|
||||
<bean id="jdbcTemplate"
|
||||
|
||||
Reference in New Issue
Block a user