diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobLauncher.java b/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobLauncher.java index 903bd9390..2e16c82dd 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobLauncher.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobLauncher.java @@ -81,7 +81,17 @@ public class SimpleJobLauncher implements JobLauncher, InitializingBean { Assert.notNull(job, "The Job must not be null."); Assert.notNull(jobParameters, "The JobParameters must not be null."); - final JobExecution jobExecution = jobRepository.createJobExecution(job, jobParameters); + boolean exists = jobRepository.isJobInstanceExists(job.getName(), jobParameters); + if (exists && !job.isRestartable()) { + throw new JobRestartException("JobInstance already exists and is not restartable"); + } + /** + * There is a very small probability that a non-restartable job can be + * restarted, but only if another process or thread manages to launch + * and fail a job execution for this instance between the last assertion + * and the next method returning successfully. + */ + final JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), jobParameters); taskExecutor.execute(new Runnable() { diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobOperator.java b/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobOperator.java index 07617cfd3..02ab10709 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobOperator.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobOperator.java @@ -85,7 +85,8 @@ public class SimpleJobOperator implements JobOperator, InitializingBean { public void afterPropertiesSet() throws Exception { Assert.notNull(jobLauncher, "JobLauncher must be provided"); Assert.notNull(jobRegistry, "JobLocator must be provided"); - Assert.notNull(jobExplorer, "BatchMetaDataExplorer must be provided"); + Assert.notNull(jobExplorer, "JobExplorer must be provided"); + Assert.notNull(jobRepository, "JobRepository must be provided"); } /** diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/JobRepository.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/JobRepository.java index 1337fd45e..57a5a26c1 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/JobRepository.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/JobRepository.java @@ -54,9 +54,8 @@ public interface JobRepository { * returned in a new {@link JobInstance}, associated with the * {@link JobExecution}. If no previous instance is found, the execution * will be associated with a new {@link JobInstance} - * + * @param jobName TODO * @param jobParameters the runtime parameters for the job - * @param job the job the execution should be associated with. * * @return a valid job {@link JobExecution} for the arguments provided * @throws JobExecutionAlreadyRunningException if there is a @@ -69,7 +68,7 @@ public interface JobRepository { * found and was already completed successfully. * */ - JobExecution createJobExecution(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, + JobExecution createJobExecution(String jobName, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException; /** 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 a761348da..fc49c375f 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 @@ -83,7 +83,7 @@ public class JobRepositoryFactoryBean extends AbstractJobRepositoryFactoryBean i * * @param isolationLevelForCreate the isolation level name to set * - * @see SimpleJobRepository#createJobExecution(org.springframework.batch.core.Job, + * @see SimpleJobRepository#createJobExecution(String, * org.springframework.batch.core.JobParameters) */ public void setIsolationLevelForCreate(String isolationLevelForCreate) { 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 78c2636d2..b14fef106 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 @@ -143,13 +143,13 @@ public class SimpleJobRepository implements JobRepository { * support the higher isolation levels). *

* - * @see JobRepository#createJobExecution(Job, JobParameters) + * @see JobRepository#createJobExecution(String, JobParameters) * */ - public JobExecution createJobExecution(Job job, JobParameters jobParameters) + public JobExecution createJobExecution(String jobName, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException { - Assert.notNull(job, "Job must not be null."); + Assert.notNull(jobName, "Job name must not be null."); Assert.notNull(jobParameters, "JobParameters must not be null."); /* @@ -161,14 +161,11 @@ public class SimpleJobRepository implements JobRepository { * has finished. */ - JobInstance jobInstance = jobInstanceDao.getJobInstance(job.getName(), jobParameters); + JobInstance jobInstance = jobInstanceDao.getJobInstance(jobName, jobParameters); ExecutionContext executionContext; // existing job instance found if (jobInstance != null) { - if (!job.isRestartable()) { - throw new JobRestartException("JobInstance already exists and is not restartable"); - } List executions = jobExecutionDao.findJobExecutions(jobInstance); @@ -188,7 +185,7 @@ public class SimpleJobRepository implements JobRepository { } else { // no job found, create one - jobInstance = jobInstanceDao.createJobInstance(job.getName(), jobParameters); + jobInstance = jobInstanceDao.createJobInstance(jobName, jobParameters); executionContext = new ExecutionContext(); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/JobSupport.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/JobSupport.java index 4cbfbd068..ec70d3aad 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/JobSupport.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/JobSupport.java @@ -142,7 +142,7 @@ public class JobSupport implements BeanNameAware, Job { */ public void execute(JobExecution execution) throws UnexpectedJobExecutionException { throw new UnsupportedOperationException( - "JobSupport does not provide an implementation of run(). Use a smarter subclass."); + "JobSupport does not provide an implementation of execute(). Use a smarter subclass."); } public String toString() { 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 16b962bc6..f7f7255a6 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 @@ -123,7 +123,7 @@ public class SimpleJobTests extends TestCase { job.setName("testJob"); job.setSteps(steps); - jobExecution = jobRepository.createJobExecution(job, jobParameters); + jobExecution = jobRepository.createJobExecution(job.getName(), jobParameters); jobInstance = jobExecution.getJobInstance(); stepExecution1 = new StepExecution(step1.getName(), jobExecution); @@ -403,7 +403,7 @@ public class SimpleJobTests extends TestCase { assertFalse(jobExecution.getExecutionContext().isEmpty()); - jobExecution = jobRepository.createJobExecution(job, jobParameters); + jobExecution = jobRepository.createJobExecution(job.getName(), jobParameters); try { job.execute(jobExecution); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/launch/SimpleJobLauncherTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/launch/SimpleJobLauncherTests.java index 30eb32588..cccfcb23d 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/launch/SimpleJobLauncherTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/launch/SimpleJobLauncherTests.java @@ -16,8 +16,14 @@ package org.springframework.batch.core.launch; -import static org.easymock.EasyMock.*; -import static org.junit.Assert.*; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.reset; +import static org.easymock.EasyMock.verify; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.List; @@ -30,6 +36,7 @@ import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.job.JobSupport; import org.springframework.batch.core.launch.support.SimpleJobLauncher; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.repository.JobRestartException; import org.springframework.batch.repeat.ExitStatus; import org.springframework.core.task.TaskExecutor; @@ -42,6 +49,7 @@ public class SimpleJobLauncherTests { private SimpleJobLauncher jobLauncher; private Job job = new JobSupport("foo") { + @Override public void execute(JobExecution execution) { execution.setExitStatus(ExitStatus.FINISHED); return; @@ -66,8 +74,8 @@ public class SimpleJobLauncherTests { JobExecution jobExecution = new JobExecution(null, null); - expect(jobRepository.createJobExecution(job, jobParameters)).andReturn(jobExecution); - + expect(jobRepository.isJobInstanceExists(job.getName(), jobParameters)).andReturn(false); + expect(jobRepository.createJobExecution(job.getName(), jobParameters)).andReturn(jobExecution); replay(jobRepository); jobLauncher.afterPropertiesSet(); @@ -77,6 +85,38 @@ public class SimpleJobLauncherTests { verify(jobRepository); } + /* + * Non-restartable JobInstance can be run only once - attempt to run + * existing non-restartable JobInstance causes error. + */ + @Test + public void testRunNonRestartableJobInstanceTwice() throws Exception { + job = new JobSupport("foo") { + @Override + public boolean isRestartable() { + return false; + } + @Override + public void execute(JobExecution execution) { + execution.setExitStatus(ExitStatus.FINISHED); + return; + } + }; + + testRun(); + try { + reset(jobRepository); + expect(jobRepository.isJobInstanceExists(job.getName(), jobParameters)).andReturn(true); + replay(jobRepository); + jobLauncher.run(job, jobParameters); + fail("Expected JobRestartException"); + } + catch (JobRestartException e) { + // expected + } + verify(jobRepository); + } + @Test public void testTaskExecutor() throws Exception { final List list = new ArrayList(); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractStepExecutionDaoTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractStepExecutionDaoTests.java index 89ff49c3c..929b6b846 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractStepExecutionDaoTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractStepExecutionDaoTests.java @@ -32,7 +32,6 @@ import org.springframework.batch.core.JobInstance; import org.springframework.batch.core.JobParameters; 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.JobRepository; import org.springframework.batch.core.step.StepSupport; import org.springframework.dao.OptimisticLockingFailureException; @@ -71,9 +70,7 @@ public abstract class AbstractStepExecutionDaoTests extends AbstractTransactiona @Before public void onSetUp() throws Exception { repository = getJobRepository(); - - - jobExecution = repository.createJobExecution(new JobSupport("testJob"), new JobParameters()); + jobExecution = repository.createJobExecution("job", new JobParameters()); jobInstance = jobExecution.getJobInstance(); step = new StepSupport("foo"); stepExecution = new StepExecution(step.getName(), jobExecution); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBeanTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBeanTests.java index 77c9ff0f7..8517af8c1 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBeanTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBeanTests.java @@ -18,7 +18,6 @@ package org.springframework.batch.core.repository.support; import static junit.framework.Assert.*; import static org.easymock.EasyMock.*; import org.springframework.batch.core.JobParameters; -import org.springframework.batch.core.job.JobSupport; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.item.database.support.DataFieldMaxValueIncrementerFactory; import org.springframework.dao.DataAccessException; @@ -161,7 +160,7 @@ public class JobRepositoryFactoryBeanTests { expect(transactionManager.getTransaction(transactionDefinition)).andReturn(null); replay(transactionManager); try { - repository.createJobExecution(new JobSupport("job"), new JobParameters()); + repository.createJobExecution("foo", new JobParameters()); // we expect an exception from the txControl because we provided the // wrong meta data fail("Expected IllegalArgumentException"); @@ -188,7 +187,7 @@ public class JobRepositoryFactoryBeanTests { replay(dataSource); replay(transactionManager); try { - repository.createJobExecution(new JobSupport("job"), new JobParameters()); + repository.createJobExecution("foo", new JobParameters()); // we expect an exception but not from the txControl because we // provided the correct meta data fail("Expected IllegalArgumentException"); @@ -215,7 +214,7 @@ public class JobRepositoryFactoryBeanTests { replay(dataSource); replay(transactionManager); try { - repository.createJobExecution(new JobSupport("job"), new JobParameters()); + repository.createJobExecution("foo", new JobParameters()); // we expect an exception but not from the txControl because we // provided the correct meta data fail("Expected IllegalArgumentException"); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/MapJobRepositoryFactoryBeanTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/MapJobRepositoryFactoryBeanTests.java index 5247c9218..9baa95624 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/MapJobRepositoryFactoryBeanTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/MapJobRepositoryFactoryBeanTests.java @@ -1,11 +1,13 @@ package org.springframework.batch.core.repository.support; +import static org.junit.Assert.fail; + import org.junit.Test; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.job.JobSupport; +import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException; import org.springframework.batch.core.repository.JobRepository; -import org.springframework.batch.core.repository.JobRestartException; /** * Tests for {@link MapJobRepositoryFactoryBean}. @@ -24,12 +26,13 @@ public class MapJobRepositoryFactoryBeanTests { Job job = new JobSupport("jobName"); JobParameters jobParameters = new JobParameters(); - repository.createJobExecution(job, jobParameters); + repository.createJobExecution(job.getName(), jobParameters); try { - repository.createJobExecution(job, jobParameters); + repository.createJobExecution(job.getName(), jobParameters); + fail("Expected JobExecutionAlreadyRunningException"); } - catch (JobRestartException e) { + catch (JobExecutionAlreadyRunningException e) { // expected } } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryIntegrationTests.java index d094efae7..0737aac09 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryIntegrationTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryIntegrationTests.java @@ -1,9 +1,13 @@ package org.springframework.batch.core.repository.support; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; import java.util.Date; +import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobParameters; @@ -12,15 +16,12 @@ 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.JobExecutionAlreadyRunningException; -import org.springframework.batch.core.repository.JobRestartException; import org.springframework.batch.core.step.StepSupport; import org.springframework.batch.item.ExecutionContext; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.ContextConfiguration; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; -import org.junit.runner.RunWith; -import org.junit.Test; /** * Repository tests using JDBC DAOs (rather than mocks). @@ -55,7 +56,7 @@ public class SimpleJobRepositoryIntegrationTests { builder.addString("stringKey", "stringValue").addLong("longKey", 1L).addDouble("doubleKey", 1.1).addDate("dateKey", new Date(1L)); JobParameters jobParams = builder.toJobParameters(); - JobExecution firstExecution = jobRepository.createJobExecution(job, jobParams); + JobExecution firstExecution = jobRepository.createJobExecution(job.getName(), jobParams); firstExecution.setStartTime(new Date()); assertNotNull(firstExecution.getLastUpdated()); @@ -64,7 +65,7 @@ public class SimpleJobRepositoryIntegrationTests { jobRepository.update(firstExecution); firstExecution.setEndTime(new Date()); jobRepository.update(firstExecution); - JobExecution secondExecution = jobRepository.createJobExecution(job, jobParams); + JobExecution secondExecution = jobRepository.createJobExecution(job.getName(), jobParams); assertEquals(firstExecution.getJobInstance(), secondExecution.getJobInstance()); assertEquals(job.getName(), secondExecution.getJobInstance().getJobName()); @@ -78,36 +79,16 @@ public class SimpleJobRepositoryIntegrationTests { public void testCreateAndFindWithNoStartDate() throws Exception { job.setRestartable(true); - JobExecution firstExecution = jobRepository.createJobExecution(job, jobParameters); + JobExecution firstExecution = jobRepository.createJobExecution(job.getName(), jobParameters); firstExecution.setStartTime(new Date(0)); firstExecution.setEndTime(new Date(1)); jobRepository.update(firstExecution); - JobExecution secondExecution = jobRepository.createJobExecution(job, jobParameters); + JobExecution secondExecution = jobRepository.createJobExecution(job.getName(), jobParameters); assertEquals(firstExecution.getJobInstance(), secondExecution.getJobInstance()); assertEquals(job.getName(), secondExecution.getJobInstance().getJobName()); } - /* - * Non-restartable JobInstance can be run only once - attempt to run - * existing non-restartable JobInstance causes error. - */ - @Transactional @Test - public void testRunNonRestartableJobInstanceTwice() throws Exception { - job.setRestartable(false); - - JobExecution firstExecution = jobRepository.createJobExecution(job, jobParameters); - jobRepository.update(firstExecution); - - try { - jobRepository.createJobExecution(job, jobParameters); - fail(); - } - catch (JobRestartException e) { - // expected - } - } - /* * Save multiple StepExecutions for the same step and check the returned * count and last execution are correct. @@ -118,7 +99,7 @@ public class SimpleJobRepositoryIntegrationTests { StepSupport step = new StepSupport("restartedStep"); // first execution - JobExecution firstJobExec = jobRepository.createJobExecution(job, jobParameters); + JobExecution firstJobExec = jobRepository.createJobExecution(job.getName(), jobParameters); StepExecution firstStepExec = new StepExecution(step.getName(), firstJobExec); jobRepository.update(firstJobExec); jobRepository.add(firstStepExec); @@ -137,7 +118,7 @@ public class SimpleJobRepositoryIntegrationTests { jobRepository.update(firstJobExec); // second execution - JobExecution secondJobExec = jobRepository.createJobExecution(job, jobParameters); + JobExecution secondJobExec = jobRepository.createJobExecution(job.getName(), jobParameters); StepExecution secondStepExec = new StepExecution(step.getName(), secondJobExec); jobRepository.update(secondJobExec); jobRepository.add(secondStepExec); @@ -156,7 +137,7 @@ public class SimpleJobRepositoryIntegrationTests { putLong("crashedPosition", 7); } }; - JobExecution jobExec = jobRepository.createJobExecution(job, jobParameters); + JobExecution jobExec = jobRepository.createJobExecution(job.getName(), jobParameters); jobExec.setStartTime(new Date(0)); jobExec.setExecutionContext(ctx); Step step = new StepSupport("step1"); @@ -182,10 +163,10 @@ public class SimpleJobRepositoryIntegrationTests { @Transactional @Test public void testOnlyOneJobExecutionAllowedRunning() throws Exception { job.setRestartable(true); - jobRepository.createJobExecution(job, jobParameters); + jobRepository.createJobExecution(job.getName(), jobParameters); try { - jobRepository.createJobExecution(job, jobParameters); + jobRepository.createJobExecution(job.getName(), jobParameters); fail(); } catch (JobExecutionAlreadyRunningException e) { diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/JobRepositorySupport.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/JobRepositorySupport.java index dfe43ffed..78a3ec790 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/JobRepositorySupport.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/JobRepositorySupport.java @@ -15,7 +15,6 @@ */ package org.springframework.batch.core.step; -import org.springframework.batch.core.Job; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobInstance; import org.springframework.batch.core.JobParameters; @@ -31,7 +30,7 @@ public class JobRepositorySupport implements JobRepository { /* (non-Javadoc) * @see org.springframework.batch.container.common.repository.JobRepository#findOrCreateJob(org.springframework.batch.container.common.domain.JobConfiguration) */ - public JobExecution createJobExecution(Job jobConfiguration, JobParameters jobParameters) { + public JobExecution createJobExecution(String jobName, JobParameters jobParameters) { return null; } 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 231b218bb..3da6e237a 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 @@ -96,7 +96,7 @@ public class SimpleStepFactoryBeanTests { step.setName("step2"); job.addStep(step); - JobExecution jobExecution = repository.createJobExecution(job, new JobParameters()); + JobExecution jobExecution = repository.createJobExecution(job.getName(), new JobParameters()); job.execute(jobExecution); assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); @@ -116,7 +116,7 @@ public class SimpleStepFactoryBeanTests { step.setName("step1"); job.addStep(step); - JobExecution jobExecution = repository.createJobExecution(job, new JobParameters()); + JobExecution jobExecution = repository.createJobExecution(job.getName(), new JobParameters()); job.execute(jobExecution); assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); @@ -150,7 +150,7 @@ public class SimpleStepFactoryBeanTests { job.setSteps(Collections.singletonList(step)); - JobExecution jobExecution = repository.createJobExecution(job, new JobParameters()); + JobExecution jobExecution = repository.createJobExecution(job.getName(), new JobParameters()); try { job.execute(jobExecution); fail("Expected RuntimeException"); @@ -179,7 +179,7 @@ public class SimpleStepFactoryBeanTests { AbstractStep step = (AbstractStep) factory.getObject(); job.setSteps(Collections.singletonList((Step) step)); - JobExecution jobExecution = repository.createJobExecution(job, new JobParameters()); + JobExecution jobExecution = repository.createJobExecution(job.getName(), new JobParameters()); try { job.execute(jobExecution); fail("Expected RuntimeException"); @@ -210,7 +210,7 @@ public class SimpleStepFactoryBeanTests { AbstractStep step = (AbstractStep) factory.getObject(); job.setSteps(Collections.singletonList((Step) step)); - JobExecution jobExecution = repository.createJobExecution(job, new JobParameters()); + JobExecution jobExecution = repository.createJobExecution(job.getName(), new JobParameters()); job.execute(jobExecution); @@ -244,7 +244,7 @@ public class SimpleStepFactoryBeanTests { job.setSteps(Collections.singletonList((Step) step)); - JobExecution jobExecution = repository.createJobExecution(job, new JobParameters()); + JobExecution jobExecution = repository.createJobExecution(job.getName(), new JobParameters()); job.execute(jobExecution); assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); 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 b8aebd2bf..089a423ff 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 @@ -116,7 +116,7 @@ public class StatefulRetryStepFactoryBeanTests { job.setRestartable(true); JobParameters jobParameters = new JobParametersBuilder().addString("statefulTest", "make_this_unique") .toJobParameters(); - jobExecution = repository.createJobExecution(job, jobParameters); + jobExecution = repository.createJobExecution(job.getName(), jobParameters); jobExecution.setEndTime(new Date()); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/ChunkOrientedStepIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/ChunkOrientedStepIntegrationTests.java index e2b9ff32c..b4047a9b6 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/ChunkOrientedStepIntegrationTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/ChunkOrientedStepIntegrationTests.java @@ -124,7 +124,7 @@ public class ChunkOrientedStepIntegrationTests { } }, chunkOperations)); - JobExecution jobExecution = jobRepository.createJobExecution(job, new JobParameters()); + JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), new JobParameters()); StepExecution stepExecution = new StepExecution(step.getName(), jobExecution); stepExecution.setExecutionContext(new ExecutionContext() { diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/StepExecutorInterruptionTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/StepExecutorInterruptionTests.java index 5296c0d4f..a00227ad5 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/StepExecutorInterruptionTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/StepExecutorInterruptionTests.java @@ -58,11 +58,11 @@ public class StepExecutorInterruptionTests extends TestCase { JobRepository jobRepository = new SimpleJobRepository(new MapJobInstanceDao(), new MapJobExecutionDao(), new MapStepExecutionDao(), new MapExecutionContextDao()); - JobSupport jobConfiguration = new JobSupport(); + JobSupport job = new JobSupport(); step = new TaskletStep("interruptedStep"); - jobConfiguration.addStep(step); - jobConfiguration.setBeanName("testJob"); - jobExecution = jobRepository.createJobExecution(jobConfiguration, new JobParameters()); + job.addStep(step); + job.setBeanName("testJob"); + jobExecution = jobRepository.createJobExecution(job.getName(), new JobParameters()); step.setJobRepository(jobRepository); step.setTransactionManager(new ResourcelessTransactionManager()); itemWriter = new ItemWriter() { diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/TasketStepTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/TasketStepTests.java index ee6661c55..cdbb94124 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/TasketStepTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/TasketStepTests.java @@ -192,7 +192,7 @@ public class TasketStepTests { new MapStepExecutionDao(), new MapExecutionContextDao()); step.setJobRepository(repository); - JobExecution jobExecution = repository.createJobExecution(job, jobInstance.getJobParameters()); + JobExecution jobExecution = repository.createJobExecution(job.getName(), jobInstance.getJobParameters()); StepExecution stepExecution = new StepExecution(step.getName(), jobExecution); step.execute(stepExecution); diff --git a/spring-batch-integration/src/test/java/org/springframework/batch/integration/JobRepositorySupport.java b/spring-batch-integration/src/test/java/org/springframework/batch/integration/JobRepositorySupport.java index 4666dfdc0..6bfb82bf3 100644 --- a/spring-batch-integration/src/test/java/org/springframework/batch/integration/JobRepositorySupport.java +++ b/spring-batch-integration/src/test/java/org/springframework/batch/integration/JobRepositorySupport.java @@ -15,7 +15,6 @@ */ package org.springframework.batch.integration; -import org.springframework.batch.core.Job; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobInstance; import org.springframework.batch.core.JobParameters; @@ -34,7 +33,7 @@ public class JobRepositorySupport implements JobRepository { /* (non-Javadoc) * @see org.springframework.batch.core.repository.JobRepository#createJobExecution(org.springframework.batch.core.Job, org.springframework.batch.core.JobParameters) */ - public JobExecution createJobExecution(Job job, JobParameters jobParameters) + public JobExecution createJobExecution(String jobName, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException { return new JobExecution(new JobInstance(0L, jobParameters, job.getName())); } 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 c47c0dc0f..6227e7ba9 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 @@ -321,7 +321,7 @@ public class ChunkMessageItemWriterIntegrationTests { JobInstanceAlreadyCompleteException { SimpleJob job = new SimpleJob(); job.setName("job"); - JobExecution jobExecution = jobRepository.createJobExecution(job, + JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), new JobParametersBuilder().addLong("job.counter", jobCounter++) .toJobParameters()); StepExecution stepExecution = jobExecution.createStepExecution(step.getName()); diff --git a/spring-batch-integration/src/test/java/org/springframework/batch/integration/file/FileToMessagesJobFactoryBeanTests.java b/spring-batch-integration/src/test/java/org/springframework/batch/integration/file/FileToMessagesJobFactoryBeanTests.java index a05b52635..8d7d60efb 100644 --- a/spring-batch-integration/src/test/java/org/springframework/batch/integration/file/FileToMessagesJobFactoryBeanTests.java +++ b/spring-batch-integration/src/test/java/org/springframework/batch/integration/file/FileToMessagesJobFactoryBeanTests.java @@ -176,7 +176,7 @@ public class FileToMessagesJobFactoryBeanTests { Job job = (Job) factory.getObject(); JobParameters jobParameters = new JobParametersBuilder().addString(FILE_INPUT_PATH, "classpath:/log4j.properties").toJobParameters(); - JobExecution jobExecution = jobRepository.createJobExecution(job, jobParameters); + JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), jobParameters); job.execute(jobExecution); assertNotNull(jobExecution); diff --git a/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/StepExecutionMessageHandlerTests.java b/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/StepExecutionMessageHandlerTests.java index b5ff8a287..0e1545f68 100644 --- a/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/StepExecutionMessageHandlerTests.java +++ b/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/StepExecutionMessageHandlerTests.java @@ -33,7 +33,6 @@ import org.springframework.batch.core.Step; import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.integration.JobRepositorySupport; -import org.springframework.batch.integration.JobSupport; import org.springframework.batch.integration.StepSupport; import org.springframework.batch.item.ExecutionContext; import org.springframework.beans.factory.annotation.Required; @@ -81,7 +80,7 @@ public class StepExecutionMessageHandlerTests { JobRepositorySupport jobRepository = new JobRepositorySupport(); StepExecutionMessageHandler handler = createHandler(jobRepository); JobExecutionRequest message = handler.handle(new JobExecutionRequest(jobRepository.createJobExecution( - new JobSupport("job"), new JobParameters()))); + job.getName(), new JobParameters()))); assertEquals(1, message.getJobExecution().getStepExecutions().size()); assertEquals(BatchStatus.COMPLETED, message.getStatus()); } @@ -91,7 +90,7 @@ public class StepExecutionMessageHandlerTests { JobRepositorySupport jobRepository = new JobRepositorySupport(); StepExecutionMessageHandler handler = createHandler(jobRepository); JobExecutionRequest jobExecutionRequest = new JobExecutionRequest(jobRepository.createJobExecution( - new JobSupport("job"), new JobParameters())); + job.getName(), new JobParameters())); jobExecutionRequest.getJobExecution().getExecutionContext().putString("foo", "bar"); JobExecutionRequest message = handler.handle(jobExecutionRequest); assertEquals(1, message.getJobExecution().getStepExecutions().size()); @@ -104,7 +103,7 @@ public class StepExecutionMessageHandlerTests { JobRepositorySupport jobRepository = new JobRepositorySupport(); StepExecutionMessageHandler handler = createHandler(jobRepository); JobExecutionRequest jobExecutionRequest = new JobExecutionRequest(jobRepository.createJobExecution( - new JobSupport("job"), new JobParameters())); + job.getName(), new JobParameters())); jobExecutionRequest.getJobExecution().getExecutionContext().putString("foo", "bar"); // The step has to add the output attribute to the context handler.setStep(new StepSupport("step") { @@ -123,7 +122,7 @@ public class StepExecutionMessageHandlerTests { public void testHandleFailedJob() throws Exception { JobRepositorySupport jobRepository = new JobRepositorySupport(); StepExecutionMessageHandler handler = createHandler(jobRepository); - JobExecution jobExecution = jobRepository.createJobExecution(new JobSupport("job"), new JobParameters()); + JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), new JobParameters()); jobExecution.setStatus(BatchStatus.FAILED); JobExecutionRequest message = handler.handle(new JobExecutionRequest(jobExecution)); assertEquals(0, message.getJobExecution().getStepExecutions().size()); @@ -158,7 +157,7 @@ public class StepExecutionMessageHandlerTests { } }; StepExecutionMessageHandler handler = createHandler(jobRepository); - JobExecution jobExecution = jobRepository.createJobExecution(new JobSupport("job"), new JobParameters()); + JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), new JobParameters()); JobExecutionRequest message = handler.handle(new JobExecutionRequest(jobExecution)); assertNotNull(message); assertEquals(1, jobExecution.getStepExecutions().size()); @@ -182,7 +181,7 @@ public class StepExecutionMessageHandlerTests { } }; StepExecutionMessageHandler handler = createHandler(jobRepository); - JobExecution jobExecution = jobRepository.createJobExecution(new JobSupport("job"), new JobParameters()); + JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), new JobParameters()); JobExecutionRequest message = handler.handle(new JobExecutionRequest(jobExecution)); assertNotNull(message); assertEquals(1, jobExecution.getStepExecutions().size()); @@ -208,7 +207,7 @@ public class StepExecutionMessageHandlerTests { } }; StepExecutionMessageHandler handler = createHandler(jobRepository); - JobExecution jobExecution = jobRepository.createJobExecution(new JobSupport("job"), new JobParameters()); + JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), new JobParameters()); JobExecutionRequest message = handler.handle(new JobExecutionRequest(jobExecution)); assertNotNull(message); assertEquals(1, jobExecution.getStepExecutions().size()); diff --git a/spring-batch-samples/src/main/resources/jobs/xmlStaxJob.xml b/spring-batch-samples/src/main/resources/jobs/xmlStaxJob.xml index ac909738f..1746685fa 100644 --- a/spring-batch-samples/src/main/resources/jobs/xmlStaxJob.xml +++ b/spring-batch-samples/src/main/resources/jobs/xmlStaxJob.xml @@ -5,16 +5,16 @@ xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" - xsi:schemaLocation=" - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd - http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd - http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd"> + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd + http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd"> - - - - + + + + jobExecutionIds = new HashSet(); @@ -87,8 +87,8 @@ public class JdbcJobRepositoryTests { @Before public void onSetUpInTransaction() throws Exception { - jobConfiguration = new JobSupport("test-job"); - jobConfiguration.setRestartable(true); + job = new JobSupport("test-job"); + job.setRestartable(true); simpleJdbcTemplate.update("DELETE FROM BATCH_EXECUTION_CONTEXT"); simpleJdbcTemplate.update("DELETE FROM BATCH_STEP_EXECUTION"); simpleJdbcTemplate.update("DELETE FROM BATCH_JOB_EXECUTION"); @@ -112,9 +112,9 @@ public class JdbcJobRepositoryTests { @Transactional @Test public void testFindOrCreateJob() throws Exception { - jobConfiguration.setName("foo"); + job.setName("foo"); int before = simpleJdbcTemplate.queryForInt("SELECT COUNT(*) FROM BATCH_JOB_INSTANCE"); - JobExecution execution = repository.createJobExecution(jobConfiguration, new JobParameters()); + JobExecution execution = repository.createJobExecution(job.getName(), new JobParameters()); int after = simpleJdbcTemplate.queryForInt("SELECT COUNT(*) FROM BATCH_JOB_INSTANCE"); assertEquals(before + 1, after); assertNotNull(execution.getId()); @@ -123,7 +123,7 @@ public class JdbcJobRepositoryTests { @Transactional @Test public void testFindOrCreateJobConcurrently() throws Exception { - jobConfiguration.setName("bar"); + job.setName("bar"); int before = simpleJdbcTemplate.queryForInt("SELECT COUNT(*) FROM BATCH_JOB_INSTANCE"); assertEquals(0, before); @@ -153,9 +153,9 @@ public class JdbcJobRepositoryTests { @Transactional @Test public void testFindOrCreateJobConcurrentlyWhenJobAlreadyExists() throws Exception { - jobConfiguration.setName("spam"); + job.setName("spam"); - JobExecution execution = repository.createJobExecution(jobConfiguration, new JobParameters()); + JobExecution execution = repository.createJobExecution(job.getName(), new JobParameters()); cacheJobIds(execution); execution.setEndTime(new Timestamp(System.currentTimeMillis())); repository.update(execution); @@ -196,7 +196,7 @@ public class JdbcJobRepositoryTests { new TransactionTemplate(transactionManager).execute(new TransactionCallback() { public Object doInTransaction(org.springframework.transaction.TransactionStatus status) { try { - JobExecution execution = repository.createJobExecution(jobConfiguration, new JobParameters()); + JobExecution execution = repository.createJobExecution(job.getName(), new JobParameters()); cacheJobIds(execution); list.add(execution); Thread.sleep(1000); @@ -216,7 +216,7 @@ public class JdbcJobRepositoryTests { }).start(); Thread.sleep(400); - JobExecution execution = repository.createJobExecution(jobConfiguration, new JobParameters()); + JobExecution execution = repository.createJobExecution(job.getName(), new JobParameters()); cacheJobIds(execution); int count = 0;