⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nightsaver.java

📁 中国联通短信通信协议
💻 JAVA
字号:
package com.wireless.sms.gwif.smsagent.workthread;

import java.text.*;
import java.util.*;
import com.wireless.sms.pub.net.DoBackMOMT;
import com.wireless.sms.pub.entity.*;
import com.wireless.sms.pub.mq.*;

import com.wireless.sms.gwif.smsagent.global.*;
/**
 * 主要是将夜间的群发缓存起来,否则将引起用户的投诉,白天的时段再发送.
 * @author Administrator
 *
 */
public class NightSaver {

  private static NightSaver _instance = new NightSaver();
  private Timer timer = null;
  private static final int INTERVAL = 10*60*1000;
  private SimpleDateFormat simpleDF = new SimpleDateFormat("HH");;
  private MTQueue mtqueue = new MTQueue();
  private String [] stimes = new String[]{"23", "00", "01", "02", "03", "04", "05", "06", "07"};
  private Vector times = new Vector();
  private static final int TOTAL = SmsGWIFGlobal.getInstance().maxMTQueueCnt;
  private static boolean reloadFlag = true;

  public static NightSaver getInstance(){
    return _instance;
  }

  private NightSaver(){
    for(int i=0; i<stimes.length; i++){
        times.add(stimes[i]);
    }
  }
  /**
   * 添加mt到NightSaver.mtqueue中,NightSaver将实现以下功能:
   * 1.保存过大的mtqueue为文件形式
   * 2.将缓存mt重新设定优先级加入到GetMOMTGlobalForUsual.mtqueue
   * @param mt
   */
  public void add(MT mt){
    mtqueue.add(mt);

    if( mtqueue.size() > TOTAL ){
      save(mtqueue);
    }

    reloadFlag = true;
  }
  /**
   * 把所有mt队列中的mt写入文件
   * @param amtqueue
   */
  private void save(MTQueue amtqueue){
    DoBackMOMT doBackmt = new DoBackMOMT( amtqueue, SmsGWIFGlobal.getInstance().MTPROBLEM);
    doBackmt.setLog(LoggerConstant.stat_log);
    doBackmt.flowAllMT();//把所有mt队列中的mt写入文件
  }
  /**
   * 将DoBackMOMT里面堆积的数据释放出来(从备份mt文件读到内存,以供发送),通过DoBackMOMT.loadMT()将文件中的mt加入到amtqueue中
   * @param amtqueue
   */
  private void reload(MTQueue amtqueue){
    DoBackMOMT doBackmt = new DoBackMOMT( amtqueue, SmsGWIFGlobal.getInstance().MTPROBLEM);
    doBackmt.setLog(LoggerConstant.stat_log);
    doBackmt.setLOADSUM(2000);
    doBackmt.loadMT();
  }
  /**
   * 停止NightSaver
   */
  private void stopTimer(){
    if( timer != null ){
      timer.cancel();
      timer = null;
    }
  }
  /**
   * 启动NightSaver,将执行以下功能:
   * 1.在非设定的时间段内 和 NightSaver.mtqueue里缓存有数据时(即reloadFlag = true),
   *   将NightSaver.mtqueue队列中的MT移出来,设置上优先级后加入到GetMoMtGlobalForUsual.mtqueue以供发送,
   *   下发mt时将按mtqueue.removeByPriority()选择高优先级的mt下发。
   * 2.将DoBackMOMT里面堆积的数据释放出来(从备份mt文件读到内存,以供发送),
   *   通过DoBackMOMT.loadMT()将文件中的mt加入到临时tmpMTQueue队列中,再根据优先级加入到GetMoMtGlobalForUsual.mtqueue中发送
   */
  public void start(){
    if( timer == null ){
      timer = new Timer(true);
      timer.schedule(new CustomTimerTask(), 1000, INTERVAL);
    }
  }
  /**
   * 实现以下功能:
   * 1.停止NightSaver
   * 2.保存NightSaver.mtqueue队列中的数据
   */
  public void stop(){
    stopTimer();
    save(mtqueue);
  }
  /**
   * 实现以下功能:
   * 1.在非设定的时间段内 和 NightSaver.mtqueue里缓存有数据时(即reloadFlag = true),
   *   将NightSaver.mtqueue队列中的MT移出来,设置上优先级后加入到GetMoMtGlobalForUsual.mtqueue以供发送,
   *   下发mt时将按mtqueue.removeByPriority()选择高优先级的mt下发。
   * 2.将DoBackMOMT里面堆积的数据释放出来(从备份mt文件读到内存,以供发送),
   *   通过DoBackMOMT.loadMT()将文件中的mt加入到临时tmpMTQueue队列中,再根据优先级加入到GetMoMtGlobalForUsual.mtqueue中发送
   * @author Administrator
   *
   */
  class CustomTimerTask extends TimerTask{
    public void run(){
      String hour = simpleDF.format(new java.util.Date());
//    在非设定的时间段内 和 NightSaver.mtqueue里缓存有数据时(即reloadFlag = true)
      if (!times.contains(hour) && reloadFlag) {
//    	将NightSaver.mtqueue队列中的MT移出来,设置上优先级后加入到GetMoMtGlobalForUsual.mtqueue以供发送
//    	  ,下发mt时将按mtqueue.removeByPriority()选择高优先级的mt下发。
        while (mtqueue.size() > 0) {
          MT tmpMt = (MT) mtqueue.removeNoWait();
          if (tmpMt != null) {
            GetMoMtGlobalForUsual.mtqueue.add(tmpMt.getMsgLevel(), tmpMt);
          }
        }
//        将DoBackMOMT里面堆积的数据释放出来(从备份mt文件读到内存)通过DoBackMOMT.loadMT()将文件中的mt加入到临时队列tmpMTQueue中
        while(true){
          MTQueue tmpMTQueue = new MTQueue();
          reload(tmpMTQueue);

          LoggerConstant.stat_log.info("----------- Load ----------------");
          LoggerConstant.stat_log.info("Size : " + tmpMTQueue.size());
          LoggerConstant.stat_log.info("----------- Load Over ----------------");
//          如果临时队列里面有数据则移出来设定优先级后加入到GetMoMtGlobalForUsual.mtqueue
          if (tmpMTQueue.size() > 0) {
            while (tmpMTQueue.size() > 0) {
              MT tmpMt = (MT) tmpMTQueue.removeNoWait();
              if (tmpMt != null) {//将tmpMTQueue中的mt加入到mtqueue队列中
                GetMoMtGlobalForUsual.mtqueue.add(tmpMt.getMsgLevel(), tmpMt);
              }
            }
          }
          else{
            break;
          }

          try {
            Thread.sleep(5000);
          }
          catch (InterruptedException ex) {
          }
        }

        reloadFlag = false;
      }
//      通过前面的操作基本保证下面的输出将只会在设定的时间内执行了NightSaver.add(mt)后才可能显示
      if( mtqueue.size() > 0 ){
        LoggerConstant.stat_log.info("nightCacheQueue = " + mtqueue.size());
      }
    }

  }


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -