import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
import com.newegg.storm.util.TimeUtils;
import com.newegg.storm.util.TupleHelpers;
/**
* receive tuple [time,obj,...]
* emit tuple [emitTime, obj, count, ...]
* @author bw67
*
*/
public abstract class ObjectCountWithTimeBolt extends ObjectCountBolt {
private long startTime;
private boolean isFirst = true;
private long emitTime;
private long tickTimesSinceLastEmit;
/**
* count the latest windowLength campaign
* and emit the result every emitFrequencyInSeconds
* @param outputFields: must match to values returned from method getValuesToEmit
* @param windowLengthInSeconds
* @param emitFrequencyInSeconds
*/
public ObjectCountWithTimeBolt(Fields outputFields, int windowLengthInSeconds, int emitFrequencyInSeconds){
super(outputFields,windowLengthInSeconds,emitFrequencyInSeconds);
}
public void execute(Tuple input) {
if (TupleHelpers.isTickTuple(input)) {
tickTimesSinceLastEmit += 1;
//if after 2 ticks, emit the last result
if(tickTimesSinceLastEmit >=2){
emitCurrentWindowCounts();
emitTime += getEmitFrequencyInSeconds() * 1000;
tickTimesSinceLastEmit = 0;
}
}
else{
long time = getObjectTime(input);
//initialize the emitTime by time of the first tuple
if(isFirst){
emitTime = TimeUtils.floor(time, "mm");
tickTimesSinceLastEmit = 0;
isFirst = false;
}
// System.out.println("time=" + TimeUtils.stringOf(time) + ", emitTime=" + TimeUtils.stringOf(emitTime));
//if time of the tuple is over the emit time, then emit the last results and update emit time
long d = time -emitTime;
if(d >= 0){
long n = d / (getEmitFrequencyInSeconds() * 1000);
for(int i = 0; i <= n; i++){
emitCurrentWindowCounts();
emitTime += getEmitFrequencyInSeconds() * 1000;
}
tickTimesSinceLastEmit = 0;
}
countObjAndAck(input);
}
}
@Override
public void doWhenEmit() {
}
@Override
public Values getValuesToEmit(Object obj, Long count) {
return new Values(emitTime,obj,count);
}
public abstract long getObjectTime(Tuple tuple);
}
object count bolt
最新推荐文章于 2022-03-31 23:58:40 发布