BATCH-401: prototype of JobInterruptionAdvice added to samples (see GracefulShutdownTests)

This commit is contained in:
robokaso
2008-02-29 18:21:06 +00:00
parent 9336443e01
commit b4655119ca
7 changed files with 248 additions and 10 deletions

View File

@@ -22,7 +22,7 @@ import org.springframework.batch.core.domain.JobParameters;
/**
* Functional test for graceful shutdown. A batch container is started in a new thread,
* then it's stopped via the Lifecycle interface.
* then it's stopped using {@link JobExecution#stop()}.
*
* @author Lucas Ward
*
@@ -39,7 +39,7 @@ public class GracefulShutdownFunctionalTests extends AbstractBatchLauncherTests
JobExecution jobExecution = launcher.run(getJob(), jobParameters);
Thread.sleep(500);
Thread.sleep(1000);
assertEquals(BatchStatus.STARTED, jobExecution.getStatus());
assertTrue(jobExecution.isRunning());
@@ -49,16 +49,11 @@ public class GracefulShutdownFunctionalTests extends AbstractBatchLauncherTests
int count = 0;
while(jobExecution.isRunning() && count <= 10){
logger.info("Checking for end time in JobExecution: count="+count);
Thread.sleep(10);
Thread.sleep(100);
count++;
}
if (count>10) {
// TODO: fix this
// fail("Timed out waiting for job to end.");
}
// TODO: fix this
// assertFalse(jobExecution.isRunning());
assertFalse("Timed out waiting for job to end.", jobExecution.isRunning());
}

View File

@@ -0,0 +1,92 @@
package org.springframework.batch.sample.advice;
import junit.framework.TestCase;
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.JobParameters;
import org.springframework.batch.sample.tasklet.JobSupport;
/**
* Tests for {@link DefaultJobInterruptionAdvice}.
*
* @author Robert Kasanicky
*/
public class DefaultJobInterruptionAdviceTests extends TestCase {
private DefaultJobInterruptionAdvice tested = new DefaultJobInterruptionAdvice();
private JobExecution jobExecution = new JobExecution(new JobInstance(new Long(1), new JobParameters(),
new JobSupport("interruptJob")));
protected void setUp() throws Exception {
tested.setJobExecution(jobExecution);
}
/**
* Scenario when JobExecution is requested to stop explicitly.
*/
public void testStop() throws JobInterruptedException {
jobExecution.stop();
try {
tested.checkInterrupt();
fail();
}
catch (JobInterruptedException e) {
// expected
}
}
/**
* Scenario when executing thread is interrupted. Needs to be run in
* separate victim thread - interrupting current thread would affect other
* tests.
*/
public void testThreadInterrupt() throws Exception {
class TestJob implements Runnable {
volatile boolean interrupted = false;
public void run() {
while (true) {
try {
tested.checkInterrupt();
}
catch (JobInterruptedException expected) {
interrupted = true;
return;
}
}
}
}
TestJob job = new TestJob();
Thread victim = new Thread(job);
victim.start();
victim.interrupt();
Thread.sleep(1000);
assertTrue(job.interrupted);
}
/**
* No exception raised when JobExecution has non-terminating status.
*/
public void testNoInterrupt() throws JobInterruptedException {
BatchStatus[] notInterruptedValues = { BatchStatus.STARTED, BatchStatus.STARTING, BatchStatus.STOPPED,
BatchStatus.UNKNOWN, BatchStatus.COMPLETED, BatchStatus.FAILED };
for (int i = 0; i < notInterruptedValues.length; i++) {
jobExecution.setStatus(notInterruptedValues[i]);
tested.checkInterrupt();
assertTrue(true);
}
}
}