protected Collection<ModuleDeploymentStatus> writeDeployment(ModuleDescriptor moduleDescriptor,
			ModuleDeploymentPropertiesProvider<RuntimeModuleDeploymentProperties> provider,
			Collection<Container> containers)
			throws InterruptedException, NoContainerException {
		ResultCollector collector = new ResultCollector();
		for (Container container : containers) {
			writeDeployment(moduleDescriptor, provider.propertiesForDescriptor(moduleDescriptor), container, collector);
		}
		Collection<ModuleDeploymentStatus> statuses = processResults(collector);
		if (statuses.isEmpty()) {
			throw new NoContainerException();
		}
		return statuses;
	}
Write module deployment requests for the provided module descriptor
using the runtime deployment properties provided by the provider
to the given matched containers.

@param moduleDescriptor      descriptor for module to deploy
@param provider  			runtime deployment properties provider for the module
@param containers     		the matched containers to deploy
@return result of request
@throws InterruptedException if the executing thread is interrupted
@throws NoContainerException if there are no containers that match the criteria
                             for module deployment
spring-xd-dirt/src/main/java/org/springframework/xd/dirt/server/admin/deployment/zk/ModuleDeploymentWriter.java