All Downloads are FREE. Search and download functionalities are using the official Maven repository.

stream.monitor.DataRateGroup Maven / Gradle / Ivy

The newest version!
/**
 * 
 */
package stream.monitor;

import java.text.DecimalFormat;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author chris
 *
 */
public class DataRateGroup {

    static Logger log = LoggerFactory.getLogger(DataRateGroup.class);

    final static Map groups = new LinkedHashMap();

    public static synchronized DataRateGroup get(String groupId) {
        DataRateGroup group = groups.get(groupId);
        if (group == null) {
            group = new DataRateGroup(groupId);
            groups.put(groupId, group);
        }
        return group;
    }

    final Object lock = new Object();

    final Set members = new LinkedHashSet();
    final Map results = new LinkedHashMap();

    final String groupId;

    public DataRateGroup(String id) {
        this.groupId = id;
    }

    public void register(String id) {
        synchronized (lock) {
            members.add(id);
        }
    }

    public void add(String id, Result result) {
        synchronized (lock) {
            results.put(id, result);

            if (results.size() == members.size()) {
                System.out.println("DataGroup results complete!");
                dumpResults();
            }
        }
    }

    public void dumpResults() {
        Long min = null;
        Long max = null;
        Double sum = 0.0;

        for (Result result : results.values()) {
            if (min == null) {
                min = result.start;
            }

            if (max == null) {
                max = result.end;
            }

            min = Math.min(min, result.start);
            max = Math.max(max, result.end);

            sum += result.items;
        }

        Double time = (max - min) / 1000.0d;
        DecimalFormat fmt = new DecimalFormat("0.000");
        log.info("Averaged total data rate for group '{}' is: {} items/sec", groupId, fmt.format(sum / time));
    }

    public static class Result {
        public final String id;
        public final long start;
        public final long end;
        public final long items;

        public Result(String id, long start, long end, long items) {
            this.id = id;
            this.start = start;
            this.end = end;
            this.items = items;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy