Svetoslav Neykov created BROOKLYN-446: -----------------------------------------
Summary: Constructor ScheduledTask(Map, Task) is broken Key: BROOKLYN-446 URL: https://issues.apache.org/jira/browse/BROOKLYN-446 Project: Brooklyn Issue Type: Bug Affects Versions: 0.10.0 Reporter: Svetoslav Neykov The resulting task is executed only once, not rescheduled. A test case to show the behaviour: {noformat} import static org.testng.Assert.assertTrue; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import org.apache.brooklyn.api.mgmt.Task; import org.apache.brooklyn.core.test.BrooklynMgmtUnitTestSupport; import org.apache.brooklyn.test.Asserts; import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.time.Duration; import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.Runnables; public class ScheduledTaskTest extends BrooklynMgmtUnitTestSupport { /** * Fails with: * java.lang.UnsupportedOperationException * at com.google.common.collect.ImmutableMap.remove(ImmutableMap.java:338) * at org.apache.brooklyn.util.core.task.BasicTask.<init>(BasicTask.java:115) * at org.apache.brooklyn.util.core.task.BasicTask.<init>(BasicTask.java:107) * at org.apache.brooklyn.util.core.task.ScheduledTask.<init>(ScheduledTask.java:96) * at org.apache.brooklyn.util.core.task.ScheduledTask.<init>(ScheduledTask.java:88) * at org.apache.brooklyn.util.core.task.ScheduledTaskTest.testImmutableFlags(ScheduledTaskTest.java:43) */ @Test public void testImmutableFlags() { Map<?, ?> flags = ImmutableMap.of( "period", Duration.ONE_SECOND, "delay", Duration.ONE_SECOND); Task<?> task = new BasicTask<>(Runnables.doNothing()); new ScheduledTask(flags, task); } /** * Fails with: * java.lang.AssertionError: failed succeeds-eventually, 69 attempts, 30005ms elapsed: AssertionError: expected [true] but found [false] * at org.apache.brooklyn.test.Asserts.succeedsEventually(Asserts.java:1008) * at org.apache.brooklyn.test.Asserts.succeedsEventually(Asserts.java:895) * at org.apache.brooklyn.test.Asserts.succeedsEventually(Asserts.java:888) * at org.apache.brooklyn.util.core.task.ScheduledTaskTest.testTaskConstructor(ScheduledTaskTest.java:60) */ @Test public void testTaskConstructor() { final AtomicInteger cnt = new AtomicInteger(); Map<?, ?> flags = MutableMap.of( "period", Duration.ONE_SECOND, "delay", Duration.ONE_SECOND); Task<?> task = new BasicTask<>(new Runnable() { @Override public void run() { cnt.incrementAndGet(); } }); ScheduledTask scheduledTask = new ScheduledTask(flags, task); mgmt.getExecutionManager().submit(scheduledTask); Asserts.succeedsEventually(new Runnable() { @Override public void run() { assertTrue(cnt.get() > 1); } }); } } {noformat} The problem is that the task gets reused and on the second schedule attempt it already has a future assigned so is not scheduled any more. The best solution seems to be to remove the constructor altogether. Optionally providing a Runnable/Callable job constructor, wrapping the job in a factory, returning a new task on each submission. -- This message was sent by Atlassian JIRA (v6.3.15#6346)