import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.lianlian.mbop.domain.ebs.body.RequestTaskBean;

public class NotifyMessageCache {
    
    private final static Logger LOGGER = LoggerFactory.getLogger(NotifyMessageCache.class);
    private final static long TIMEOUT = 12 * 60 * 60 * 1000;
    private final static int SLEEP_SECOND = 10 * 60;
    
    public static ConcurrentHashMap chargeRequest = new ConcurrentHashMap();
    
    private static Thread timeoutThread = null;
    
    public static synchronized void initTimeoutWorker(){
        if (timeoutThread == null) {
            
            timeoutThread = new Thread() {
                @Override
                public void run() {
                    while(true){
                        sleepSecond(SLEEP_SECOND);
                        try {
                            removeTimeout(chargeRequest, "流量充值");
                        } catch(Exception e) {
                            LOGGER.warn("NotifyMessageCache 内部清理线程,处理超时请求异常:", e);
                        }
                    }
                }
                
                private void removeTimeout(ConcurrentHashMap requests, String describe){
                    Set keys = requests.keySet();
                    for(String key : keys){
                        RequestTaskBean requestTaskBean = requests.get(key);
                        if (requestTaskBean != null && (System.currentTimeMillis() - requestTaskBean.getStartTime() > TIMEOUT)) {
                            RequestTaskBean removeTaskBean = requests.remove(key);
                            if (removeTaskBean != null) {
                                LOGGER.error("删除超时[" + describe + "]请求,请求内容:[" + removeTaskBean.getTaskBean().getRequest().getContent() + "]");
                            }
                        }
                    }
                }
                
                private void sleepSecond(int second){
                    try {
                        LOGGER.warn("NotifyMessageCache 内部清理线程休眠[" + second + "]秒.");
                        Thread.sleep(second * 1000);
                    } catch (Exception e) {
                        LOGGER.warn("NotifyMessageCache 内部清理线程sleep异常:", e);
                    }
                }
                
            };
            
            timeoutThread.setDaemon(true);
            timeoutThread.start();
        }
        
    }
    
}