package com.alimama.quanjingmonitor.topology;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import com.alimama.mdrill.adhoc.TimeCacheMap;
public class LastTimeBolt_chain1 implements TimeCacheMap.ExpiredCallback<BoltStatKey,BoltStatVal>{
private TimeCacheMap<BoltStatKey, BoltStatVal> bufferMap=null;
private TimeCacheMap.Timeout<BoltStatKey, BoltStatVal> clean=null;
private TimeCacheMap.Update<BoltStatKey, BoltStatVal> update=null;
private volatile long lasttimeout=0l;
private LastTimeBolt_chain2_pid chain_pid;
private LastTimeBolt_chain2_host chain_host;
public LastTimeBolt_chain1(SumReduceBolt bolt,LastTimeBolt_chain2_pid chain_pid,LastTimeBolt_chain2_host chain_host)
{
this.chain_pid=chain_pid;
this.chain_host=chain_host;
this.bufferMap=new TimeCacheMap<BoltStatKey, BoltStatVal>(60, this);
this.update=new TimeCacheMap.Update<BoltStatKey, BoltStatVal>() {
@Override
public synchronized BoltStatVal update(BoltStatKey key, BoltStatVal old,
BoltStatVal newval) {
if(old==null)
{
return newval.copy();
}
BoltStatVal rtn=old.copy();
rtn.cnt+=newval.cnt;
rtn.cntnonclear+=newval.cntnonclear;
return rtn;
}
};
this.clean=new TimeCacheMap.Timeout<BoltStatKey, BoltStatVal>() {
@Override
public synchronized boolean timeout(BoltStatKey key, BoltStatVal val) {
return LastTimeBolt_chain1.this.lasttimeout>(Long)key.list[0];
}
};
}
@Override
public synchronized void expire(BoltStatKey key, BoltStatVal val) {
if(key.isPidKey)
{
this.chain_pid.update(key, val);
}else{
this.chain_host.update(key,val );
}
}
@Override
public void commit() {
}
private TimeOutCheck timeoutCheck=new TimeOutCheck(20*1000l);
private long localMergerDelay=20*1000;
private long lastts=0;
public void updateAll(HashMap<BoltStatKey, BoltStatVal> buffer,long logTs)
{
this.bufferMap.updateAll(buffer, this.update);
if(timeoutCheck.istimeout())
{
this.lasttimeout=((System.currentTimeMillis()-localMergerDelay)/60000)*60000;
bufferMap.fourceTimeout(this.clean,this.update);
timeoutCheck.reset();
}
int ramsize=bufferMap.size();
if(ramsize>50000)
{
bufferMap.fourceTimeout();
}
this.chain_host.maybeupdateAll(logTs);
this.chain_pid.maybeupdateAll(logTs);
this.lastts=logTs;
}
private static SimpleDateFormat formatHour = new SimpleDateFormat("HH:mm:ss");
public String toDebugString() {
return "LastTimeBolt_chain1 "+formatHour.format(lastts)+","+bufferMap.size()+","+this.chain_host.toDebugString()+","+this.chain_pid.toDebugString();
}
}