package com.alimama.quanjingmonitor.topology;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import org.apache.log4j.Logger;
import org.apache.solr.common.SolrInputDocument;
import com.alimama.mdrill.adhoc.TimeCacheMap;
import com.alimama.mdrill.ui.service.MdrillService;
public class LastTimeBolt_chain2_host implements TimeCacheMap.ExpiredCallback<BoltStatKey,BoltStatVal>{
private static Logger LOG = Logger.getLogger(LastTimeBolt_chain2_host.class);
private TimeCacheMap<BoltStatKey, BoltStatVal> bufferMap=null;
private SumReduceBolt bolt;
private TimeCacheMap.Timeout<BoltStatKey, BoltStatVal> clean=null;
private TimeCacheMap.Update<BoltStatKey, BoltStatVal> update=null;
private ArrayList<SolrInputDocument> doclistBuffer=null;
private Object doclistLock=new Object();
public LastTimeBolt_chain2_host(SumReduceBolt bolt)
{
this.bolt=bolt;
this.bufferMap=new TimeCacheMap<BoltStatKey, BoltStatVal>(600, this);
this.doclistBuffer=new ArrayList<SolrInputDocument>(300);
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_chain2_host.this.lasttimeout>(Long)key.list[0];
}
};
}
volatile long lasttimeout=0l;
private TimeOutCheck timeoutCheck=new TimeOutCheck(60*1000l);
long localMergerDelay=60*1000;
public void update(BoltStatKey k, BoltStatVal val)
{
bufferMap.update(k, val, this.update);
}
public void maybeupdateAll(long logTs)
{
if(timeoutCheck.istimeout(logTs))
{
this.lasttimeout=logTs;
bufferMap.fourceTimeout(this.clean,this.update);
timeoutCheck.reset();
}
int ramsize=bufferMap.size();
if(ramsize>50000)
{
bufferMap.fourceTimeout();
}
}
private static SimpleDateFormat formatDay = new SimpleDateFormat("yyyyMMdd");
private static SimpleDateFormat formatPartion = new SimpleDateFormat("yyyyMMdd");
private static SimpleDateFormat formatDay2 = new SimpleDateFormat("yyyy-MM-dd");
private static SimpleDateFormat formatHour = new SimpleDateFormat("HH:mm:ss");
private static SimpleDateFormat formatHourStr = new SimpleDateFormat("yyyyMMddHH");
@Override
public synchronized void expire(BoltStatKey key, BoltStatVal val) {
Date d=new Date(60000+(Long) key.list[0]);
SolrInputDocument doc=new SolrInputDocument();
doc.addField("thedate", formatDay.format(d));
doc.addField("mdrillPartion", formatPartion.format(d));
doc.addField("mdrillCmd", "add");
doc.addField("higo_uuid", 0);
doc.addField("miniute", formatDay2.format(d)+"T"+formatHour.format(d)+"Z");
doc.addField("hour", formatHourStr.format(d));
doc.addField("logtype", this.bolt.type);
doc.addField("groupName", key.list[1]);
doc.addField("nodename", key.list[2]);
doc.addField("dns_ip", key.list[3]);
doc.addField("nodegroup", key.list[4]);
doc.addField("product_name", key.list[5]);
doc.addField("site", key.list[6]);
doc.addField("datanum_a", val.cnt);
doc.addField("datanum_b", val.cntnonclear);
boolean needCommit=false;
synchronized (doclistLock) {
doclistBuffer.add(doc);
needCommit=doclistBuffer.size()>200;
}
if(needCommit)
{
this.commit();
}
}
@Override
public synchronized void commit() {
ArrayList<SolrInputDocument> buffer=null;
synchronized (doclistLock) {
buffer=doclistBuffer;
doclistBuffer=new ArrayList<SolrInputDocument>(300);
}
if(buffer!=null&&buffer.size()>0)
{
try {
LOG.info("debug=>request:"+buffer.size());
MdrillService.insert("quanjingmointor_host", buffer,null);
} catch (Throwable e) {
LOG.error("insert", e);
}
}
}
public String toDebugString() {
synchronized (doclistLock) {
return "host chain "+doclistBuffer.size()+","+bufferMap.size();
}
}
}