diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/AbstractJobRepositoryFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/AbstractJobRepositoryFactoryBean.java index bd53bc6c1..57a081ac2 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/AbstractJobRepositoryFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/AbstractJobRepositoryFactoryBean.java @@ -4,6 +4,7 @@ import org.springframework.aop.framework.ProxyFactory; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.aop.support.NameMatchMethodPointcut; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.repository.dao.ExecutionContextDao; import org.springframework.batch.core.repository.dao.JobExecutionDao; import org.springframework.batch.core.repository.dao.JobInstanceDao; import org.springframework.batch.core.repository.dao.StepExecutionDao; @@ -53,6 +54,11 @@ public abstract class AbstractJobRepositoryFactoryBean implements FactoryBean, I * @return fully configured {@link StepExecutionDao} implementation. */ protected abstract StepExecutionDao createStepExecutionDao() throws Exception; + + /** + * @return fully configured {@link ExecutionContextDao} implementation. + */ + protected abstract ExecutionContextDao createExecutionContextDao() throws Exception; public Object getObject() throws Exception { return proxyFactory.getProxy(); @@ -95,7 +101,7 @@ public abstract class AbstractJobRepositoryFactoryBean implements FactoryBean, I } private Object getTarget() throws Exception { - return new SimpleJobRepository(createJobInstanceDao(), createJobExecutionDao(), createStepExecutionDao()); + return new SimpleJobRepository(createJobInstanceDao(), createJobExecutionDao(), createStepExecutionDao(), createExecutionContextDao()); } /** diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBean.java index def52e804..9a3d90ac5 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBean.java @@ -19,6 +19,8 @@ package org.springframework.batch.core.repository.support; import javax.sql.DataSource; import org.springframework.batch.core.repository.dao.AbstractJdbcBatchMetadataDao; +import org.springframework.batch.core.repository.dao.ExecutionContextDao; +import org.springframework.batch.core.repository.dao.JdbcExecutionContextDao; import org.springframework.batch.core.repository.dao.JdbcJobExecutionDao; import org.springframework.batch.core.repository.dao.JdbcJobInstanceDao; import org.springframework.batch.core.repository.dao.JdbcStepExecutionDao; @@ -126,4 +128,13 @@ public class JobRepositoryFactoryBean extends AbstractJobRepositoryFactoryBean { dao.afterPropertiesSet(); return dao; } + + @Override + protected ExecutionContextDao createExecutionContextDao() throws Exception { + JdbcExecutionContextDao dao = new JdbcExecutionContextDao(); + dao.setJdbcTemplate(jdbcTemplate); + dao.setTablePrefix(tablePrefix); + dao.afterPropertiesSet(); + return dao; + } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/MapJobRepositoryFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/MapJobRepositoryFactoryBean.java index be8083de3..45b9d1d75 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/MapJobRepositoryFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/MapJobRepositoryFactoryBean.java @@ -1,7 +1,9 @@ package org.springframework.batch.core.repository.support; +import org.springframework.batch.core.repository.dao.ExecutionContextDao; import org.springframework.batch.core.repository.dao.JobExecutionDao; import org.springframework.batch.core.repository.dao.JobInstanceDao; +import org.springframework.batch.core.repository.dao.MapExecutionContextDao; import org.springframework.batch.core.repository.dao.MapJobExecutionDao; import org.springframework.batch.core.repository.dao.MapJobInstanceDao; import org.springframework.batch.core.repository.dao.MapStepExecutionDao; @@ -29,4 +31,9 @@ public class MapJobRepositoryFactoryBean extends AbstractJobRepositoryFactoryBea return new MapStepExecutionDao(); } + @Override + protected ExecutionContextDao createExecutionContextDao() throws Exception { + return new MapExecutionContextDao(); + } + } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/SimpleJobRepository.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/SimpleJobRepository.java index 64d718572..d5cb7fd8e 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/SimpleJobRepository.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/SimpleJobRepository.java @@ -30,6 +30,7 @@ import org.springframework.batch.core.repository.JobExecutionAlreadyRunningExcep import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.repository.JobRestartException; +import org.springframework.batch.core.repository.dao.ExecutionContextDao; import org.springframework.batch.core.repository.dao.JobExecutionDao; import org.springframework.batch.core.repository.dao.JobInstanceDao; import org.springframework.batch.core.repository.dao.StepExecutionDao; @@ -62,6 +63,8 @@ public class SimpleJobRepository implements JobRepository { private StepExecutionDao stepExecutionDao; + private ExecutionContextDao ecDao; + /** * Provide default constructor with low visibility in case user wants to use * use aop:proxy-target-class="true" for AOP interceptor. @@ -70,11 +73,12 @@ public class SimpleJobRepository implements JobRepository { } public SimpleJobRepository(JobInstanceDao jobInstanceDao, JobExecutionDao jobExecutionDao, - StepExecutionDao stepExecutionDao) { + StepExecutionDao stepExecutionDao, ExecutionContextDao ecDao) { super(); this.jobInstanceDao = jobInstanceDao; this.jobExecutionDao = jobExecutionDao; this.stepExecutionDao = stepExecutionDao; + this.ecDao = ecDao; } /** @@ -236,7 +240,7 @@ public class SimpleJobRepository implements JobRepository { stepExecutionDao.updateStepExecution(stepExecution); } - + private void validateStepExecution(StepExecution stepExecution) { Assert.notNull(stepExecution, "StepExecution cannot be null."); Assert.notNull(stepExecution.getStepName(), "StepExecution's step name cannot be null."); @@ -246,14 +250,14 @@ public class SimpleJobRepository implements JobRepository { /* * (non-Javadoc) * - * @seeorg.springframework.batch.core.repository.JobRepository# - * saveOrUpdateExecutionContext + * @see org.springframework.batch.core.repository.JobRepository# + * persistExecutionContext * (org.springframework.batch.core.domain.StepExecution) */ public void persistExecutionContext(StepExecution stepExecution) { // Until there is an interface change ( - stepExecutionDao.persistExecutionContext(stepExecution); - jobExecutionDao.persistExecutionContext(stepExecution.getJobExecution()); + ecDao.persistExecutionContext(stepExecution.getJobExecution()); + ecDao.persistExecutionContext(stepExecution); } /** diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java index a7c76e5ec..4d3454f8a 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java @@ -38,8 +38,10 @@ import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.UnexpectedJobExecutionException; import org.springframework.batch.core.listener.JobExecutionListenerSupport; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.repository.dao.ExecutionContextDao; import org.springframework.batch.core.repository.dao.JobExecutionDao; import org.springframework.batch.core.repository.dao.JobInstanceDao; +import org.springframework.batch.core.repository.dao.MapExecutionContextDao; import org.springframework.batch.core.repository.dao.MapJobExecutionDao; import org.springframework.batch.core.repository.dao.MapJobInstanceDao; import org.springframework.batch.core.repository.dao.MapStepExecutionDao; @@ -64,6 +66,8 @@ public class SimpleJobTests extends TestCase { private JobExecutionDao jobExecutionDao; private StepExecutionDao stepExecutionDao; + + private ExecutionContextDao ecDao; private List list = new ArrayList(); @@ -89,10 +93,12 @@ public class SimpleJobTests extends TestCase { MapJobInstanceDao.clear(); MapJobExecutionDao.clear(); MapStepExecutionDao.clear(); + MapExecutionContextDao.clear(); jobInstanceDao = new MapJobInstanceDao(); jobExecutionDao = new MapJobExecutionDao(); stepExecutionDao = new MapStepExecutionDao(); - jobRepository = new SimpleJobRepository(jobInstanceDao, jobExecutionDao, stepExecutionDao); + ecDao = new MapExecutionContextDao(); + jobRepository = new SimpleJobRepository(jobInstanceDao, jobExecutionDao, stepExecutionDao, ecDao); job = new SimpleJob(); job.setJobRepository(jobRepository); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/MapStepExecutionDaoTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/MapStepExecutionDaoTests.java index b498ec841..3218133e2 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/MapStepExecutionDaoTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/MapStepExecutionDaoTests.java @@ -13,7 +13,8 @@ public class MapStepExecutionDaoTests extends AbstractStepExecutionDaoTests { MapJobInstanceDao.clear(); MapJobExecutionDao.clear(); MapStepExecutionDao.clear(); - return new SimpleJobRepository(new MapJobInstanceDao(), new MapJobExecutionDao(), new MapStepExecutionDao()); + return new SimpleJobRepository(new MapJobInstanceDao(), new MapJobExecutionDao(), new MapStepExecutionDao(), + new MapExecutionContextDao()); } } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryTests.java index c1dd4dcac..e34e3cbe7 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryTests.java @@ -30,6 +30,7 @@ import org.springframework.batch.core.JobParametersBuilder; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.job.JobSupport; +import org.springframework.batch.core.repository.dao.ExecutionContextDao; import org.springframework.batch.core.repository.dao.JobExecutionDao; import org.springframework.batch.core.repository.dao.JobInstanceDao; import org.springframework.batch.core.repository.dao.StepExecutionDao; @@ -60,6 +61,8 @@ public class SimpleJobRepositoryTests extends TestCase { JobInstanceDao jobInstanceDao; StepExecutionDao stepExecutionDao; + + ExecutionContextDao ecDao; JobInstance databaseJob; @@ -75,8 +78,9 @@ public class SimpleJobRepositoryTests extends TestCase { jobExecutionDao = createMock(JobExecutionDao.class); jobInstanceDao = createMock(JobInstanceDao.class); stepExecutionDao = createMock(StepExecutionDao.class); + ecDao = createMock(ExecutionContextDao.class); - jobRepository = new SimpleJobRepository(jobInstanceDao, jobExecutionDao, stepExecutionDao); + jobRepository = new SimpleJobRepository(jobInstanceDao, jobExecutionDao, stepExecutionDao, ecDao); jobParameters = new JobParametersBuilder().toJobParameters(); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/ItemOrientedStepTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/ItemOrientedStepTests.java index 9292250c0..7f32e4def 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/ItemOrientedStepTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/ItemOrientedStepTests.java @@ -35,6 +35,7 @@ import org.springframework.batch.core.StepExecutionListener; import org.springframework.batch.core.UnexpectedJobExecutionException; import org.springframework.batch.core.job.JobSupport; import org.springframework.batch.core.listener.StepExecutionListenerSupport; +import org.springframework.batch.core.repository.dao.MapExecutionContextDao; import org.springframework.batch.core.repository.dao.MapJobExecutionDao; import org.springframework.batch.core.repository.dao.MapJobInstanceDao; import org.springframework.batch.core.repository.dao.MapStepExecutionDao; @@ -156,7 +157,7 @@ public class ItemOrientedStepTests extends TestCase { public void testRepository() throws Exception { SimpleJobRepository repository = new SimpleJobRepository(new MapJobInstanceDao(), new MapJobExecutionDao(), - new MapStepExecutionDao()); + new MapStepExecutionDao(), new MapExecutionContextDao()); itemOrientedStep.setJobRepository(repository); JobExecution jobExecution = repository.createJobExecution(job, jobInstance.getJobParameters()); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SimpleStepFactoryBeanTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SimpleStepFactoryBeanTests.java index f6f44348a..49c932d6d 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SimpleStepFactoryBeanTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SimpleStepFactoryBeanTests.java @@ -32,6 +32,7 @@ import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.job.AbstractJob; import org.springframework.batch.core.job.SimpleJob; import org.springframework.batch.core.listener.ItemListenerSupport; +import org.springframework.batch.core.repository.dao.MapExecutionContextDao; import org.springframework.batch.core.repository.dao.MapJobExecutionDao; import org.springframework.batch.core.repository.dao.MapJobInstanceDao; import org.springframework.batch.core.repository.dao.MapStepExecutionDao; @@ -58,7 +59,7 @@ public class SimpleStepFactoryBeanTests extends TestCase { private List recovered = new ArrayList(); private SimpleJobRepository repository = new SimpleJobRepository(new MapJobInstanceDao(), new MapJobExecutionDao(), - new MapStepExecutionDao()); + new MapStepExecutionDao(), new MapExecutionContextDao()); private List written = new ArrayList(); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/StatefulRetryStepFactoryBeanTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/StatefulRetryStepFactoryBeanTests.java index effd71d79..5af693388 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/StatefulRetryStepFactoryBeanTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/StatefulRetryStepFactoryBeanTests.java @@ -32,6 +32,7 @@ import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.StepListener; import org.springframework.batch.core.job.JobSupport; import org.springframework.batch.core.listener.SkipListenerSupport; +import org.springframework.batch.core.repository.dao.MapExecutionContextDao; import org.springframework.batch.core.repository.dao.MapJobExecutionDao; import org.springframework.batch.core.repository.dao.MapJobInstanceDao; import org.springframework.batch.core.repository.dao.MapStepExecutionDao; @@ -67,7 +68,7 @@ public class StatefulRetryStepFactoryBeanTests extends TestCase { int count = 0; private SimpleJobRepository repository = new SimpleJobRepository(new MapJobInstanceDao(), new MapJobExecutionDao(), - new MapStepExecutionDao()); + new MapStepExecutionDao(), new MapExecutionContextDao()); JobExecution jobExecution; diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/StepExecutorInterruptionTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/StepExecutorInterruptionTests.java index dab8701cd..3de0d93ca 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/StepExecutorInterruptionTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/StepExecutorInterruptionTests.java @@ -25,6 +25,7 @@ import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.job.JobSupport; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.repository.dao.MapExecutionContextDao; import org.springframework.batch.core.repository.dao.MapJobExecutionDao; import org.springframework.batch.core.repository.dao.MapJobInstanceDao; import org.springframework.batch.core.repository.dao.MapStepExecutionDao; @@ -54,7 +55,7 @@ public class StepExecutorInterruptionTests extends TestCase { MapStepExecutionDao.clear(); JobRepository jobRepository = new SimpleJobRepository(new MapJobInstanceDao(), new MapJobExecutionDao(), - new MapStepExecutionDao()); + new MapStepExecutionDao(), new MapExecutionContextDao()); JobSupport jobConfiguration = new JobSupport(); step = new ItemOrientedStep("interruptedStep"); diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/repository/dao/sql-dao-test.xml b/spring-batch-core/src/test/resources/org/springframework/batch/core/repository/dao/sql-dao-test.xml index ed2a5d432..c55455ed7 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/repository/dao/sql-dao-test.xml +++ b/spring-batch-core/src/test/resources/org/springframework/batch/core/repository/dao/sql-dao-test.xml @@ -9,6 +9,11 @@ + + + + + diff --git a/spring-batch-integration/src/test/java/org/springframework/batch/integration/chunk/ChunkMessageItemWriterIntegrationTests.java b/spring-batch-integration/src/test/java/org/springframework/batch/integration/chunk/ChunkMessageItemWriterIntegrationTests.java index 37e42d03f..2b0c9e1ab 100644 --- a/spring-batch-integration/src/test/java/org/springframework/batch/integration/chunk/ChunkMessageItemWriterIntegrationTests.java +++ b/spring-batch-integration/src/test/java/org/springframework/batch/integration/chunk/ChunkMessageItemWriterIntegrationTests.java @@ -20,6 +20,7 @@ import org.springframework.batch.core.job.SimpleJob; import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException; import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException; import org.springframework.batch.core.repository.JobRestartException; +import org.springframework.batch.core.repository.dao.MapExecutionContextDao; import org.springframework.batch.core.repository.dao.MapJobExecutionDao; import org.springframework.batch.core.repository.dao.MapJobInstanceDao; import org.springframework.batch.core.repository.dao.MapStepExecutionDao; @@ -63,7 +64,7 @@ public class ChunkMessageItemWriterIntegrationTests { factory = new SimpleStepFactoryBean(); jobRepository = new SimpleJobRepository(new MapJobInstanceDao(), - new MapJobExecutionDao(), new MapStepExecutionDao()); + new MapJobExecutionDao(), new MapStepExecutionDao(), new MapExecutionContextDao()); factory.setJobRepository(jobRepository); factory.setTransactionManager(new ResourcelessTransactionManager()); factory.setBeanName("step"); diff --git a/spring-batch-integration/src/test/resources/simple-job-launcher-context.xml b/spring-batch-integration/src/test/resources/simple-job-launcher-context.xml index 30911ad32..43274ef42 100644 --- a/spring-batch-integration/src/test/resources/simple-job-launcher-context.xml +++ b/spring-batch-integration/src/test/resources/simple-job-launcher-context.xml @@ -22,8 +22,11 @@ class="org.springframework.batch.core.repository.support.SimpleJobRepository"> - - + + + +