From 0940d1b9e39959bd000ea34e95e2c18118bd101f Mon Sep 17 00:00:00 2001 From: dsyer Date: Wed, 16 Sep 2009 08:27:25 +0000 Subject: [PATCH] RESOLVED - issue BATCH-1405: Starvation of threads - TaskExecutorRepeatTemplate Added test case looking for potential issue. --- ...ecutorRepeatTemplateAsynchronousTests.java | 2 -- ...RepeatTemplateSimpleAsynchronousTests.java | 21 ++++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplateAsynchronousTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplateAsynchronousTests.java index e8a1c9541..a96146153 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplateAsynchronousTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplateAsynchronousTests.java @@ -260,6 +260,4 @@ public class TaskExecutorRepeatTemplateAsynchronousTests extends AbstractTradeBa assertTrue(threadNames.size() >= 1); } - // TODO: test transactional callback with async template. - } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplateSimpleAsynchronousTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplateSimpleAsynchronousTests.java index dadedf7b9..5b6b25912 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplateSimpleAsynchronousTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplateSimpleAsynchronousTests.java @@ -76,7 +76,7 @@ public class TaskExecutorRepeatTemplateSimpleAsynchronousTests { public RepeatStatus doInIteration(RepeatContext context) throws Exception { int position = count.incrementAndGet(); - String item = position <= TOTAL ? "" + count : null; + String item = position <= TOTAL ? "" + position : null; items.add("" + item); if (item != null) { beBusy(); @@ -124,6 +124,25 @@ public class TaskExecutorRepeatTemplateSimpleAsynchronousTests { } + @Test + public void testThrottleLimitEarlyFinishThreadStarvation() throws Exception { + + early = 2; + SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor(); + // Set the concurrency limit below the throttle limit for possible starvation condition + taskExecutor.setConcurrencyLimit(20); + template.setTaskExecutor(taskExecutor); + + template.iterate(callback); + int frequency = Collections.frequency(items, "null"); + // System.err.println("Frequency: " + frequency); + // System.err.println("Items: " + items); + // One extra task will be submitted before the termination is detected + assertEquals(TOTAL, items.size() - frequency); + assertTrue(frequency <= throttleLimit + 1); + + } + @Test public void testThrottleLimitEarlyFinishOneThread() throws Exception {