package storm.applications.bolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.collections.buffer.CircularFifoBuffer;
import org.apache.commons.lang3.mutable.MutableLong;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import storm.applications.constants.LogProcessingConstants.Conf;
import storm.applications.constants.LogProcessingConstants.Field;
/**
* This bolt will count number of log events per minute
*/
public class VolumeCountBolt extends AbstractBolt {
private static final Logger LOG = LoggerFactory.getLogger(VolumeCountBolt.class);
private CircularFifoBuffer buffer;
private Map<Long, MutableLong> counts;
@Override
public void initialize() {
int windowSize = config.getInt(Conf.VOLUME_COUNTER_WINDOW, 60);
buffer = new CircularFifoBuffer(windowSize);
counts = new HashMap<>(windowSize);
}
@Override
public void execute(Tuple input) {
long minute = input.getLongByField(Field.TIMESTAMP_MINUTES);
MutableLong count = counts.get(minute);
if (count == null) {
if (buffer.isFull()) {
long oldMinute = (Long) buffer.remove();
counts.remove(oldMinute);
}
count = new MutableLong(1);
counts.put(minute, count);
buffer.add(minute);
} else {
count.increment();
}
collector.emit(input, new Values(minute, count.longValue()));
collector.ack(input);
}
@Override
public Fields getDefaultFields() {
return new Fields(Field.TIMESTAMP_MINUTES, Field.COUNT);
}
}