package com.alimama.quanjingmonitor.topology; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; 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 Click_LastTimeBolt_chain implements TimeCacheMap.ExpiredCallback<BoltStatKey,BoltStatVal>{ private static Logger LOG = Logger.getLogger(Click_LastTimeBolt_chain.class); private TimeCacheMap<BoltStatKey, BoltStatVal> RamDirector_access=null; private ClickReduceBolt 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 Click_LastTimeBolt_chain(ClickReduceBolt bolt) { this.bolt=bolt; this.RamDirector_access=new TimeCacheMap<BoltStatKey, BoltStatVal>(120, this); this.doclistBuffer=new ArrayList<SolrInputDocument>(300); this.update=new TimeCacheMap.Update<BoltStatKey, BoltStatVal>() { @Override public 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 boolean timeout(BoltStatKey key, BoltStatVal val) { return Click_LastTimeBolt_chain.this.lasttimeout>(Long)key.list[0]; } }; } volatile long lasttimeout=0l; private TimeOutCheck timeoutCheck=new TimeOutCheck(60*1000l); long localMergerDelay=60*1000; long lastts=0; public void updateAll(HashMap<BoltStatKey, BoltStatVal> buffer,long logTs) { this.RamDirector_access.updateAll(buffer, this.update); this.maybeupdateAll(logTs); } public void maybeupdateAll(long logTs) { if(timeoutCheck.istimeout(logTs)) { this.lasttimeout=logTs; RamDirector_access.fourceTimeout(this.clean,this.update); timeoutCheck.reset(); } int ramsize=RamDirector_access.size(); if(ramsize>50000) { RamDirector_access.fourceTimeout(); } this.lastts=logTs; } 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 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("pid", key.list[1]); doc.addField("datanum", val.cnt); boolean needCommit=false; synchronized (doclistLock) { doclistBuffer.add(doc); needCommit=doclistBuffer.size()>200; } if(needCommit) { this.commit(); } } @Override public 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_click", buffer,null); } catch (Throwable e) { LOG.error("insert", e); } } } public String toDebugString() { return "access "+formatHour.format(lastts)+","+doclistBuffer.size()+","+RamDirector_access.size(); } }