OPEN - issue BATCH-378: RepeatListener is confusing and too generic to use for 'intercepting' a step

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

Add JobListener to SimpleJob.  Change StepListener method names.
This commit is contained in:
dsyer
2008-02-28 16:56:36 +00:00
parent e9f0b41eed
commit 04f641d321
12 changed files with 305 additions and 28 deletions

View File

@@ -25,8 +25,10 @@ import org.springframework.batch.core.domain.BatchStatus;
import org.springframework.batch.core.domain.JobExecution;
import org.springframework.batch.core.domain.JobInstance;
import org.springframework.batch.core.domain.JobInterruptedException;
import org.springframework.batch.core.domain.JobListener;
import org.springframework.batch.core.domain.Step;
import org.springframework.batch.core.domain.StepExecution;
import org.springframework.batch.core.interceptor.CompositeJobListener;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.runtime.ExitStatusExceptionClassifier;
import org.springframework.batch.execution.scope.SimpleStepContext;
@@ -50,6 +52,18 @@ public class SimpleJob extends AbstractJob {
private ExitStatusExceptionClassifier exceptionClassifier = new SimpleExitStatusExceptionClassifier();
private CompositeJobListener listener = new CompositeJobListener();
public void setListeners(JobListener[] listeners) {
for (int i = 0; i < listeners.length; i++) {
this.listener.register(listeners[i]);
}
}
public void setListener(JobListener listener) {
this.listener.register(listener);
}
/**
* Run the specified job by looping through the steps and delegating to the
* {@link Step}.
@@ -73,6 +87,8 @@ public class SimpleJob extends AbstractJob {
execution.setStartTime(new Date());
updateStatus(execution, BatchStatus.STARTING);
listener.beforeJob(execution);
int startedCount = 0;
@@ -114,6 +130,8 @@ public class SimpleJob extends AbstractJob {
updateStatus(execution, BatchStatus.COMPLETED);
listener.afterJob();
}
catch (JobInterruptedException e) {
updateStatus(execution, BatchStatus.STOPPED);

View File

@@ -182,10 +182,10 @@ public class TaskletStep implements Step, InitializingBean, BeanNameAware {
Exception fatalException = null;
try {
listener.open(stepExecution);
listener.beforeStep(stepExecution);
exitStatus = tasklet.execute();
try {
exitStatus = exitStatus.and(listener.close());
exitStatus = exitStatus.and(listener.afterStep());
}
catch (Exception e) {
logger.error("Encountered an error on listener close.", e);
@@ -205,7 +205,7 @@ public class TaskletStep implements Step, InitializingBean, BeanNameAware {
logger.error("Encountered an error running the tasklet");
updateStatus(stepExecution, BatchStatus.FAILED);
try {
exitStatus = exitStatus.and(listener.onError(e));
exitStatus = exitStatus.and(listener.onErrorInStep(e));
}
catch (Exception ex) {
logger.error("Encountered an error on listener close.", ex);

View File

@@ -28,6 +28,7 @@ import org.springframework.batch.core.domain.JobInterruptedException;
import org.springframework.batch.core.domain.JobParameters;
import org.springframework.batch.core.domain.Step;
import org.springframework.batch.core.domain.StepExecution;
import org.springframework.batch.core.interceptor.JobListenerSupport;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.runtime.ExitStatusExceptionClassifier;
import org.springframework.batch.execution.repository.SimpleJobRepository;
@@ -140,6 +141,19 @@ public class SimpleJobTests extends TestCase {
assertNotNull(jobExecution.getStartTime());
}
public void testRunNormallyWithListener() throws Exception {
job.setListener(new JobListenerSupport() {
public void beforeJob(JobExecution jobExecution) {
list.add("before");
}
public void afterJob() {
list.add("after");
}
});
job.execute(jobExecution);
assertEquals(4, list.size());
}
public void testRunWithSimpleStepExecutor() throws Exception {
job.setJobRepository(jobRepository);

View File

@@ -105,10 +105,10 @@ public class TaskletStepTests extends TestCase {
public void testSuccessfulExecutionWithListener() throws Exception {
TaskletStep step = new TaskletStep(new StubTasklet(false, false), new JobRepositorySupport());
step.setListener(new StepListenerSupport() {
public void open(StepExecution context) {
public void beforeStep(StepExecution context) {
list.add("open");
}
public ExitStatus close() {
public ExitStatus afterStep() {
list.add("close");
return ExitStatus.CONTINUABLE;
}