Github user ahgittin commented on a diff in the pull request:

    https://github.com/apache/incubator-brooklyn/pull/999#discussion_r44514991
  
    --- Diff: 
usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/ParallelTestCaseImpl.java
 ---
    @@ -0,0 +1,130 @@
    +package org.apache.brooklyn.test.framework;
    +
    +import java.util.Collection;
    +import java.util.concurrent.ExecutionException;
    +
    +import org.apache.brooklyn.api.location.Location;
    +import org.apache.brooklyn.api.mgmt.Task;
    +import org.apache.brooklyn.api.mgmt.TaskAdaptable;
    +import org.apache.brooklyn.core.entity.AbstractEntity;
    +import org.apache.brooklyn.core.entity.Attributes;
    +import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
    +import org.apache.brooklyn.core.entity.trait.StartableMethods;
    +import org.apache.brooklyn.util.core.task.DynamicTasks;
    +import org.apache.brooklyn.util.exceptions.Exceptions;
    +import org.slf4j.Logger;
    +import org.slf4j.LoggerFactory;
    +
    +/**
    + * This implementation will start all child entities in parallel.
    + * 
    + * @author Chris Burke
    + */
    +public class ParallelTestCaseImpl extends AbstractEntity implements 
ParallelTestCase {
    +
    +    private static final Logger logger = 
LoggerFactory.getLogger(ParallelTestCaseImpl.class);
    +
    +    /**
    +     * {@inheritDoc}
    +     */
    +    public void start(Collection<? extends Location> locations) {
    +        // Let everyone know we're starting up (so that the GUI shows the 
correct icon).
    +        sensors().set(Attributes.SERVICE_STATE_ACTUAL, Lifecycle.STARTING);
    +        try {
    +            // Get an unsubmitted task for starting all the children of 
this entity in parallel,
    +            // at the same location as this entity.
    +            final TaskAdaptable<?> taskAdaptable = 
StartableMethods.startingChildren(this);
    +            logger.trace("{}, TaskAdaptable: {}", this, taskAdaptable);
    +
    +            // Submit the task to the ExecutionManager so that they 
actually get started
    +            // and then wait until all the parallel child entities have 
completed.
    +            submitTaskAndWait(taskAdaptable);
    --- End diff --
    
    what you've done works but I'd probably do:
    
        DynamicTasks.queue(taskAdaptable);
        DynamicTasks.waitForLast();
    
    because it's an effector it's guaranteed to have a queueing context, and 
the advantage of a queueing context is that you can build up more complicated 
task logic (e.g. starting `target` if required) ahead of time and that task 
logic shows up nicely in the UI.  obviously you want to wait for the queue to 
drain before setting the service state or catching, which is what 
`waitForLast()` does, and it throws if there's a problem.  i wish we had better 
guidance on tasks (though i think @sjcorbett wrote some?).
    
    more logging than we'd usually do as all the info will be available in the 
effector/task logging, but no issues with that especially if it's helpful to 
learn.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to