OPEN - issue BATCH-771: Refactor Listeners for chunk changes

Change step handler to not process items again if already completed
This commit is contained in:
dsyer
2008-08-22 09:07:15 +00:00
parent 6c76c7ae6d
commit c208014073
6 changed files with 183 additions and 90 deletions

View File

@@ -343,14 +343,13 @@ public class SkipLimitStepFactoryBeanTests {
factory.setSkipLimit(4);
factory.setItemReader(reader);
factory.setItemWriter(writer);
factory.setCommitInterval(3); // includes all expected skips
Step step = (Step) factory.getObject();
StepExecution stepExecution = jobExecution.createStepExecution(step);
step.execute(stepExecution);
System.err.println(writer.written);
System.err.println(reader.processed);
assertEquals(4, stepExecution.getSkipCount());
assertEquals(2, stepExecution.getReadSkipCount());
assertEquals(2, stepExecution.getWriteSkipCount());

View File

@@ -43,6 +43,7 @@ import org.springframework.batch.core.repository.dao.MapStepExecutionDao;
import org.springframework.batch.core.repository.support.SimpleJobRepository;
import org.springframework.batch.core.step.AbstractStep;
import org.springframework.batch.core.step.skip.SkipLimitExceededException;
import org.springframework.batch.item.ItemKeyGenerator;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.support.ListItemReader;
@@ -283,17 +284,17 @@ public class StatefulRetryStepFactoryBeanTests {
assertEquals(4, processed.size());
// []
assertEquals(0, recovered.size());
assertEquals(0, stepExecution.getItemCount());
assertEquals(1, stepExecution.getItemCount());
}
@Test
public void testNonSkippableException() throws Exception {
// Very specific skippable exception
factory.setSkippableExceptionClasses(new Class[] { UnsupportedOperationException.class });
// ...which is not retryable...
factory.setRetryableExceptionClasses(new Class<?>[0]);
factory.setSkipLimit(1);
List<String> items = Arrays.asList(new String[] { "b" });
ItemReader<String> provider = new ListItemReader<String>(items) {
@@ -323,7 +324,7 @@ public class StatefulRetryStepFactoryBeanTests {
catch (RuntimeException e) {
// expected
String message = e.getMessage();
assertTrue("Wrong message: "+message, message.contains("Write error - planned but not skippable."));
assertTrue("Wrong message: " + message, message.contains("Write error - planned but not skippable."));
}
assertEquals(0, stepExecution.getSkipCount());
@@ -333,7 +334,7 @@ public class StatefulRetryStepFactoryBeanTests {
assertEquals(1, processed.size());
// []
assertEquals(0, recovered.size());
assertEquals(0, stepExecution.getItemCount());
assertEquals(1, stepExecution.getItemCount());
}
@Test
@@ -376,7 +377,7 @@ public class StatefulRetryStepFactoryBeanTests {
assertEquals(4, processed.size());
// []
assertEquals(0, recovered.size());
assertEquals(0, stepExecution.getItemCount());
assertEquals(1, stepExecution.getItemCount());
}
@Test
@@ -390,7 +391,7 @@ public class StatefulRetryStepFactoryBeanTests {
factory.setCacheCapacity(2);
ItemReader<String> provider = new ItemReader<String>() {
public String read() {
String item = ""+count;
String item = "" + count;
provided.add(item);
count++;
if (count >= 10) {
@@ -409,6 +410,12 @@ public class StatefulRetryStepFactoryBeanTests {
};
factory.setItemReader(provider);
factory.setItemWriter(itemWriter);
factory.setItemKeyGenerator(new ItemKeyGenerator() {
public Object getKey(Object item) {
// return random object so the cache fills up
return new Object();
}
});
AbstractStep step = (AbstractStep) factory.getObject();
StepExecution stepExecution = new StepExecution(step.getName(), jobExecution);
@@ -420,13 +427,14 @@ public class StatefulRetryStepFactoryBeanTests {
// expected
}
assertEquals(1, stepExecution.getSkipCount());
// We added a bogus key generator so no items are actually skipped
// because they aren't recognised as eligible
assertEquals(0, stepExecution.getSkipCount());
// only one item processed but three (the commit interval) were provided
// [0, 1, 2]
assertEquals(3, provided.size());
// TODO: this is a bug: 0 was skipped but it came back in the buffer for the second try
// [0, 0, 1, 0, 0]
assertEquals(5, processed.size());
// [0, 0, 0]
assertEquals(3, processed.size());
// []
assertEquals(0, recovered.size());
}