package org.cloudfoundry.picalc.messaging; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Aggregate { private static final Logger logger = LoggerFactory.getLogger(Aggregate.class); private CountDownLatch latch; private double result; // For logging private double completionNumber; private String correlationId; public Aggregate(String correlationId, int completionNumber) { this.correlationId = correlationId; this.completionNumber = completionNumber; latch = new CountDownLatch(completionNumber); } public void process(double value) { synchronized (this) { result += value; } double percentComplete = 100 - ((latch.getCount() / completionNumber) * 100); if ( percentComplete % 5 == 0) { logger.info( percentComplete + " % complete, correlation id = " + correlationId); } latch.countDown(); } public synchronized double getResult() { return result; } public void await() throws InterruptedException { logger.info("Wating up to 20 seconds for reply to " + completionNumber + " messages for correlation Id = " + correlationId); latch.await(20, TimeUnit.SECONDS); logger.info("Done waiting."); } }