package com.fourinone; import java.util.Timer; import java.util.Calendar; import java.util.Date; import java.util.TimerTask; import java.util.ArrayList; import java.rmi.ConnectException; import java.util.List; public class HbDaemo { static Timer tm = new Timer(); private static PutHbTask putTask = null; private static GetHbTask getTask = null; private static ClearTask clrTask = null; final static long pt = Long.parseLong(ConfigContext.getConfig("PARK","HEARTBEAT",null,"500")); final static long dt = Long.parseLong(ConfigContext.getConfig("PARK","MAXDELAY",null,"0")); final static long gt = pt*2; final static String vs = "\u3001"; public static void runTask(TimerTask tt, int d, long p){ Calendar cal = Calendar.getInstance(); cal.add(Calendar.MILLISECOND, d); tm.scheduleAtFixedRate(tt, cal.getTime(), p); } public static void runPutTask(Park pk, ParkLeader pl, String domain, String node, String sessionid){ if(putTask==null) { LogUtil.fine("", "", "heartbeat runPutTask:"); putTask = new PutHbTask(pk, pl, domain, node, sessionid); runTask(putTask, (int)pt, pt); } else{ putTask.append(domain, node); } } public static void runGetTask(ObjValue hbinfo, ParkService ps){ if(getTask==null) { LogUtil.fine("", "", "heartbeat runGetTask:"+hbinfo); getTask = new GetHbTask(hbinfo, ps); runTask(getTask, (int)pt, pt); } } //run clear cache public static void runClearTask(ParkService ps){ if(clrTask==null) { Double cpd = new Double(ConfigContext.getConfig("PARK","CLEARPERIOD",null,"12")); if(cpd>0) { LogUtil.fine("", "", "Run ClearTask"); Double exp = new Double(ConfigContext.getConfig("PARK","EXPIRATION",null,"24")); clrTask = new ClearTask(ps,ConfigContext.getSecTime(exp)); runTask(clrTask, 5000, ConfigContext.getSecTime(cpd)); } } } public static void main(String[] args) { //if(args[0].equals("get")) //HbDaemo.runTask(new GetHbTask()); //else //HbDaemo.runTask(new PutHbTask()); } } class PutHbTask extends TimerTask { private Park pk; private ParkLeader pl; private String domain; private String node; private String sessionid; private ArrayList<String> putList = new ArrayList<String>(); PutHbTask(Park pk, ParkLeader pl, String domain, String node, String sessionid){ this.pk=pk; this.pl=pl; this.domain=domain; this.node=node; this.sessionid=sessionid; append(domain, node); } public void append(String domain, String node){ putList.add(domain+HbDaemo.vs+node); } public void run() { try{ //System.out.println("heartbeat"); String[] putarr = new String[putList.size()]; putList.toArray(putarr); pk.heartbeat(putarr, sessionid); }catch(Exception e){ //e.printStackTrace(); LogUtil.info("[PutHbTask]", "[heartbeat:]", e.getMessage()); //this.cancel(); //HbDaemo.tm.cancel(); if(e instanceof ConnectException){ this.pk = pl.getNextLeader(); } } } } class GetHbTask extends TimerTask { private ObjValue hbinfo; private ParkService ps; GetHbTask(ObjValue hbinfo, ParkService ps){ this.hbinfo = hbinfo; this.ps = ps; } public void run() { ArrayList<String> hbarr = hbinfo.getObjNames(); for(String domainnodekey:hbarr) { long curtime = new Date().getTime(); Long lasttime = (Long)hbinfo.getObj(domainnodekey); long t = lasttime!=null?curtime-lasttime:0; //System.out.println(domainnodekey+":"+t); if(t>HbDaemo.gt){ //System.out.println("t/HbDaemo.gt:"+t/HbDaemo.gt); if(HbDaemo.dt>0&&t/HbDaemo.gt<2) LogUtil.warn("[Park]", "[Slow]", domainnodekey+" slow and weak heartbeat!"); if(t>HbDaemo.gt+HbDaemo.dt){ if(HbDaemo.dt>0) LogUtil.warn("[Park]", "[Dead]", domainnodekey+" has exceeded max delaytime and is regarded as dead by park."); hbinfo.remove(domainnodekey); String[] keyarr = domainnodekey.split(HbDaemo.vs); ps.delete(keyarr[0], keyarr[1]); LogUtil.fine("", "", "hbinfo:"+hbinfo); } } } } } class ClearTask extends TimerTask { private ParkService ps; private long expl; ClearTask(ParkService ps, long expl){ this.ps = ps; this.expl = expl; } public void run() { //long expl = HbDaemo.ConfigContext.getSecTime(exp); ParkObjValue pov = (ParkObjValue)ps.getTheParkinfo(); List<String[]> expkeys = pov.getParkInfoExp(expl); if(expkeys.size()>0) { LogUtil.fine("", "", "Get some expiration data and save for backup..."); //intofile and date for name } for(String[] keyarr:expkeys) { LogUtil.fine("[Clear]", "[Expiration]", pov.getDomainnodekey(keyarr[0], keyarr[1])); ps.delete(keyarr[0], keyarr[1]); } } }