📄 nightsaver.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 + -