Various tidying up to remove tasklet from simple steps and fix samples config.

This commit is contained in:
dsyer
2008-02-10 11:45:58 +00:00
parent 0bc8aa4493
commit 7775b270d5
10 changed files with 95 additions and 82 deletions

View File

@@ -564,7 +564,7 @@ public class JdbcStepDao implements StepDao, InitializingBean {
// Avoid concurrent modifications...
if (count == 0) {
throw new OptimisticLockingFailureException("Attempt to update step execution id="
+ stepExecution.getId() + " with out of date version (" + stepExecution.getVersion() + ")");
+ stepExecution.getId() + " with wrong version (" + stepExecution.getVersion() + ")");
}
stepExecution.incrementVersion();

View File

@@ -19,7 +19,6 @@ package org.springframework.batch.execution.step.simple;
import org.springframework.batch.core.domain.Step;
import org.springframework.batch.core.domain.StepExecution;
import org.springframework.batch.core.domain.StepInterruptedException;
import org.springframework.batch.core.tasklet.Tasklet;
import org.springframework.batch.io.exception.BatchCriticalException;
import org.springframework.batch.repeat.RepeatOperations;
@@ -37,8 +36,6 @@ public class RepeatOperationsStep extends AbstractStep implements RepeatOperatio
private volatile RepeatOperations stepOperations;
private volatile Tasklet tasklet;
/**
* Public accessor for the chunkOperations property.
*
@@ -56,11 +53,6 @@ public class RepeatOperationsStep extends AbstractStep implements RepeatOperatio
public void setChunkOperations(RepeatOperations chunkOperations) {
this.chunkOperations = chunkOperations;
}
public void setTasklet(Tasklet tasklet) {
this.tasklet = tasklet;
}
/**
* Public accessor for the stepOperations property.

View File

@@ -28,32 +28,69 @@ import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.tasklet.Tasklet;
import org.springframework.batch.io.exception.BatchCriticalException;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
/**
* A {@link Step} that executes a {@link Tasklet} directly. This step does not manage transactions or any looping
* functionality. The tasklet should do this on its own.
* A {@link Step} that executes a {@link Tasklet} directly. This step does not
* manage transactions or any looping functionality. The tasklet should do this
* on its own.
*
* @author Ben Hale
*/
public class TaskletStep extends StepSupport {
public class TaskletStep extends StepSupport implements InitializingBean {
private static final Log logger = LogFactory.getLog(TaskletStep.class);
private final Tasklet tasklet;
private Tasklet tasklet;
private final JobRepository jobRepository;
private JobRepository jobRepository;
/**
* Check mandatory properties.
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
public void afterPropertiesSet() throws Exception {
Assert.notNull(jobRepository, "JobRepository is mandatory for TaskletStep");
Assert.notNull(tasklet, "Tasklet is mandatory for TaskletStep");
}
/**
* Default constructor is useful for XML configuration.
*/
public TaskletStep() {
super();
}
/**
* Creates a new <code>Step</code> for executing a <code>Tasklet</code>
*
* @param tasklet The <code>Tasklet</code> to execute
* @param jobRepository The <code>JobRepository</code> to use for persistence of incremental state
* @param jobRepository The <code>JobRepository</code> to use for
* persistence of incremental state
*/
public TaskletStep(Tasklet tasklet, JobRepository jobRepository) {
this();
this.tasklet = tasklet;
this.jobRepository = jobRepository;
}
/**
* Public setter for the {@link Tasklet}.
* @param tasklet the {@link Tasklet} to set
*/
public void setTasklet(Tasklet tasklet) {
this.tasklet = tasklet;
}
/**
* Public setter for the {@link JobRepository}.
* @param jobRepository the {@link JobRepository} to set
*/
public void setJobRepository(JobRepository jobRepository) {
this.jobRepository = jobRepository;
}
public void execute(StepExecution stepExecution) throws StepInterruptedException, BatchCriticalException {
stepExecution.setStartTime(new Date());
updateStatus(stepExecution, BatchStatus.STARTED);
@@ -62,11 +99,13 @@ public class TaskletStep extends StepSupport {
try {
exitStatus = tasklet.execute();
updateStatus(stepExecution, BatchStatus.COMPLETED);
} catch (Exception e) {
}
catch (Exception e) {
logger.error("Encountered an error running the tasklet");
updateStatus(stepExecution, BatchStatus.FAILED);
throw new BatchCriticalException(e);
} finally {
}
finally {
stepExecution.setExitStatus(exitStatus);
stepExecution.setEndTime(new Date());
jobRepository.saveOrUpdate(stepExecution);

View File

@@ -30,7 +30,6 @@ import org.springframework.batch.core.domain.StepInstance;
import org.springframework.batch.core.domain.StepInterruptedException;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.runtime.ExitCodeExceptionClassifier;
import org.springframework.batch.core.tasklet.Tasklet;
import org.springframework.batch.execution.repository.SimpleJobRepository;
import org.springframework.batch.execution.repository.dao.JobDao;
import org.springframework.batch.execution.repository.dao.MapJobDao;
@@ -38,6 +37,7 @@ import org.springframework.batch.execution.repository.dao.MapStepDao;
import org.springframework.batch.execution.repository.dao.StepDao;
import org.springframework.batch.execution.step.simple.SimpleStep;
import org.springframework.batch.io.exception.BatchCriticalException;
import org.springframework.batch.item.reader.AbstractItemReader;
import org.springframework.batch.repeat.ExitStatus;
/**
@@ -136,17 +136,17 @@ public class SimpleJobTests extends TestCase {
job.setJobRepository(jobRepository);
// do not set StepExecutorFactory...
stepConfiguration1.setStartLimit(5);
stepConfiguration1.setTasklet(new Tasklet() {
public ExitStatus execute() throws Exception {
stepConfiguration1.setItemReader(new AbstractItemReader() {
public Object read() throws Exception {
list.add("1");
return ExitStatus.FINISHED;
return null;
}
});
stepConfiguration2.setStartLimit(5);
stepConfiguration2.setTasklet(new Tasklet() {
public ExitStatus execute() throws Exception {
stepConfiguration2.setItemReader(new AbstractItemReader() {
public Object read() throws Exception {
list.add("2");
return ExitStatus.FINISHED;
return null;
}
});
job.execute(jobExecution);
@@ -251,7 +251,6 @@ public class SimpleJobTests extends TestCase {
private Runnable runnable;
private Exception exception;
private Tasklet tasklet;
/**
* @param string
@@ -266,13 +265,6 @@ public class SimpleJobTests extends TestCase {
public void setProcessException(Exception exception) {
this.exception = exception;
}
/**
* @param tasklet the tasklet to set
*/
public void setTasklet(Tasklet tasklet) {
this.tasklet = tasklet;
}
/**
* @param runnable

View File

@@ -25,12 +25,10 @@ import org.springframework.batch.core.domain.JobInstance;
import org.springframework.batch.core.domain.JobParameters;
import org.springframework.batch.core.domain.StepExecution;
import org.springframework.batch.core.domain.StepInstance;
import org.springframework.batch.core.tasklet.Tasklet;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.reader.ItemReaderAdapter;
import org.springframework.batch.item.writer.ItemWriterAdapter;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.batch.repeat.RepeatContext;
import org.springframework.batch.repeat.interceptor.RepeatInterceptorAdapter;
import org.springframework.batch.repeat.policy.SimpleCompletionPolicy;
@@ -135,11 +133,6 @@ public class RepeatOperationsStepTests extends TestCase {
configuration.setStepOperations(stepTemplate);
configuration.setJobRepository(new JobRepositorySupport());
configuration.setTransactionManager(new ResourcelessTransactionManager());
configuration.setTasklet(new Tasklet() {
public ExitStatus execute() throws Exception {
return ExitStatus.CONTINUABLE;
}
});
StepExecution stepExecution = new StepExecution(new StepInstance(
new Long(11)), new JobExecution(new JobInstance(new Long(0L), new JobParameters()),
new Long(12)));

View File

@@ -17,10 +17,8 @@ package org.springframework.batch.execution.step.simple;
import junit.framework.TestCase;
import org.springframework.batch.core.tasklet.Tasklet;
import org.springframework.batch.item.reader.AbstractItemReader;
import org.springframework.batch.item.writer.AbstractItemWriter;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.batch.repeat.exception.handler.DefaultExceptionHandler;
import org.springframework.batch.support.transaction.ResourcelessTransactionManager;

View File

@@ -2,30 +2,51 @@ package org.springframework.batch.execution.step.tasklet;
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.core.domain.StepExecution;
import org.springframework.batch.core.domain.StepInstance;
import org.springframework.batch.core.domain.StepInterruptedException;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.tasklet.Tasklet;
import org.springframework.batch.execution.step.simple.JobRepositorySupport;
import org.springframework.batch.io.exception.BatchCriticalException;
import org.springframework.batch.repeat.ExitStatus;
public class TaskletStepTest extends TestCase {
public class TaskletStepTests extends TestCase {
private StepExecution stepExecution;
protected void setUp() throws Exception {
stepExecution = new StepExecution(new StepInstance(new Long(11)), new JobExecution(new JobInstance(
new Long(0L), new JobParameters()), new Long(12)));
new Long(0L), new JobParameters()), new Long(12)));
}
public void testTaskletMandatory() throws Exception {
TaskletStep step = new TaskletStep();
step.setJobRepository(new JobRepositorySupport());
try {
step.afterPropertiesSet();
}
catch (IllegalArgumentException e) {
String message = e.getMessage();
assertTrue("Message should contain 'tasklet': " + message, message.toLowerCase().contains("tasklet"));
}
}
public void testRepositoryMandatory() throws Exception {
TaskletStep step = new TaskletStep();
try {
step.afterPropertiesSet();
}
catch (IllegalArgumentException e) {
String message = e.getMessage();
assertTrue("Message should contain 'tasklet': " + message, message.toLowerCase().contains("tasklet"));
}
}
public void testSuccessfulExecution() throws StepInterruptedException, BatchCriticalException {
TaskletStep step = new TaskletStep(new StubTasklet(false, false), new StubJobRepository());
TaskletStep step = new TaskletStep(new StubTasklet(false, false), new JobRepositorySupport());
step.execute(stepExecution);
assertNotNull(stepExecution.getStartTime());
assertSame(ExitStatus.FINISHED, stepExecution.getExitStatus());
@@ -33,7 +54,7 @@ public class TaskletStepTest extends TestCase {
}
public void testFailureExecution() throws StepInterruptedException, BatchCriticalException {
TaskletStep step = new TaskletStep(new StubTasklet(true, false), new StubJobRepository());
TaskletStep step = new TaskletStep(new StubTasklet(true, false), new JobRepositorySupport());
step.execute(stepExecution);
assertNotNull(stepExecution.getStartTime());
assertSame(ExitStatus.FAILED, stepExecution.getExitStatus());
@@ -41,11 +62,12 @@ public class TaskletStepTest extends TestCase {
}
public void testExceptionExecution() throws StepInterruptedException, BatchCriticalException {
TaskletStep step = new TaskletStep(new StubTasklet(false, true), new StubJobRepository());
TaskletStep step = new TaskletStep(new StubTasklet(false, true), new JobRepositorySupport());
try {
step.execute(stepExecution);
fail();
} catch (BatchCriticalException e) {
}
catch (BatchCriticalException e) {
assertNotNull(stepExecution.getStartTime());
assertSame(ExitStatus.FAILED, stepExecution.getExitStatus());
assertNotNull(stepExecution.getEndTime());
@@ -77,29 +99,4 @@ public class TaskletStepTest extends TestCase {
}
private class StubJobRepository implements JobRepository {
public JobExecution createJobExecution(Job job, JobParameters jobParameters)
throws JobExecutionAlreadyRunningException {
// TODO Auto-generated method stub
return null;
}
public void saveOrUpdate(JobExecution jobExecution) {
// TODO Auto-generated method stub
}
public void saveOrUpdate(StepExecution stepExecution) {
// TODO Auto-generated method stub
}
public void update(JobInstance jobInstance) {
// TODO Auto-generated method stub
}
public void update(StepInstance stepInstance) {
// TODO Auto-generated method stub
}
}
}

View File

@@ -21,11 +21,10 @@
<bean id="infiniteLoopJob" parent="simpleJob">
<property name="steps">
<bean id="step1" parent="simpleStep">
<bean id="step1" parent="taskletStep">
<property name="tasklet">
<bean id="module" class="org.springframework.batch.sample.tasklet.InfiniteLoopTasklet"/>
</property>
<property name="commitInterval" value="2" />
</bean>
</property>
</bean>

View File

@@ -83,15 +83,20 @@
<property name="restartable" value="true" />
</bean>
<bean id="abstractStep" abstract="true">
<bean id="taskletStep"
class="org.springframework.batch.execution.step.tasklet.TaskletStep"
abstract="true">
<property name="jobRepository" ref="jobRepository" />
<property name="transactionManager" ref="transactionManager" />
<property name="allowStartIfComplete" value="true" />
<property name="saveExecutionAttributes" value="true" />
</bean>
<bean id="abstractStep" class="org.springframework.batch.execution.step.simple.SimpleStep"
abstract="true" parent="taskletStep">
<property name="transactionManager" ref="transactionManager" />
</bean>
<bean id="simpleStep" parent="abstractStep"
class="org.springframework.batch.execution.step.simple.SimpleStep"
abstract="true">
<property name="exceptionHandler">
<bean

View File

@@ -4,9 +4,7 @@ import java.util.ArrayList;
import junit.framework.TestCase;
import org.easymock.MockControl;
import org.springframework.batch.io.exception.BatchCriticalException;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.reader.ListItemReader;
import org.springframework.batch.repeat.context.RepeatContextSupport;
import org.springframework.batch.repeat.synch.RepeatSynchronizationManager;