package com.alimama.quanjingmonitor.mdrillImport.parse.for416tmp; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; import org.apache.log4j.Logger; import com.alimama.mdrill.json.JSONArray; import com.alimama.mdrill.json.JSONObject; import com.alimama.mdrill.ui.service.MdrillService; public class FetchAdid2PidWireLess { private static Logger LOG = Logger.getLogger(FetchAdid2PidWireLess.class); private static AtomicReference<HashMap<String, String>> lastCache=new AtomicReference<HashMap<String,String>>(new HashMap<String,String>()); private static AtomicLong ts=new AtomicLong(System.currentTimeMillis()); private static long maxdiff=1000l*1800; private static AtomicInteger times=new AtomicInteger(0); private static AtomicBoolean isinit=new AtomicBoolean(false); private static Object lock=new Object(); public static Map<String,String> fetch() { if(isinit.get()) { if(FetchAdid2PidWireLess.times.incrementAndGet()<1000) { return FetchAdid2PidWireLess.lastCache.get(); } FetchAdid2PidWireLess.times.set(0); Long nowts=System.currentTimeMillis(); if(nowts-FetchAdid2PidWireLess.ts.get()<FetchAdid2PidWireLess.maxdiff) { return FetchAdid2PidWireLess.lastCache.get(); } } Long nowts=System.currentTimeMillis(); synchronized (FetchAdid2PidWireLess.lock) { if(isinit.get()) { if(nowts-FetchAdid2PidWireLess.ts.get()<FetchAdid2PidWireLess.maxdiff) { return FetchAdid2PidWireLess.lastCache.get(); } } /** * * CREATE TABLE ods_quanjing_416_wireless_pid ( putin_date string, media string, pidname string, pidsize string, isjs string, putintype string, pid string, lwfrom string, promiseclick string , thedate string ) */ for(int j=0;j<100;j++) { HashMap<String, String> rtn=new HashMap<String, String>(); try { String strday=ColsDefine.formatDay.format(new Date(System.currentTimeMillis()-1000l*3600*24)); String fqstr="[{\"thedate\":{\"operate\":1,\"value\":[\""+strday+"\"]}}]"; String jsonstr=MdrillService.result("ods_quanjing_416_wireless_pid", null, "0", "10000", fqstr, null, "putin_date,pid,lwfrom,count(*)", "putin_date,pid,lwfrom", "count(*)", "desc", null, null); LOG.info("fetch "+j+"@"+jsonstr); JSONObject jsonObj = new JSONObject(jsonstr); if(!jsonObj.getString("code").equals("1")) { sleep(); continue; } JSONArray list=jsonObj.getJSONObject("data").getJSONArray("docs"); if(list.length()==0) { sleep(); continue; } for(int i=0;i<list.length();i++) { try { JSONObject item = list.getJSONObject(i); String delivey_date= String.valueOf(item.get("putin_date")); String adid = String.valueOf(item.get("lwfrom")); String pid = String.valueOf(item.get("pid")); rtn.put(delivey_date+"@"+adid, pid); } catch (Exception e) { LOG.info("fetch parse error", e); } } FetchAdid2PidWireLess.lastCache.set(rtn); FetchAdid2PidWireLess.ts.set(System.currentTimeMillis()); isinit.set(true); LOG.info("fetch_result:"+FetchAdid2PidWireLess.lastCache.toString()); return rtn; } catch (Exception e) { LOG.info("fetch error",e); sleep(); } } } return FetchAdid2PidWireLess.lastCache.get(); } private static void sleep() { try { Thread.sleep(30000); } catch (InterruptedException e) { } } }