📄 serialcache.java
字号:
package com.wireless.sms.gwif.smsagent.func;
import java.util.*;
import com.wireless.sms.pub.entity.MT;
/**
* 实现MT序列下发要求时的缓存功能
* 原理:将要求序列下发的MT的MoID缓存起来
* @author Administrator
*
*/
public class SerialCache {
private static int SIZE = 1000;
private boolean ok;//未初始化默认为false
/**保存对象是不是下一条下发的mt,内容是(moID,HashMap(curpos,mt))*/
private InnerMap queueMap = new InnerMap(SIZE);
/**保存对象是顺序下发中下一条应该发送的mt的Curpos,内容为(moID,curpos)*/
private InnerMap keyMap = new InnerMap(SIZE);
private Vector validKey = new Vector();
public boolean isOk() {
return ok;
}
/**
* 对于不是下一条顺序发送的mt进行缓存;缓存规则是:首先,检查queueMap中是否已经存储MoID,如果已经存储,
* 则在该MoID映射中追加一个(curpos,当前mt),如果还没有存储则向queueMap中建立新的映射(MoID,HashMap(curpos,当前mt));
* 其次,检查keyMap是否已经有当前的MoID键,如果没有则建立新的映射(MoID,下一个应该下发的curpos = 1)
* @param mt
*/
public void addMT(MT mt){
if( queueMap.containsKey(mt.getMoID()) ){
Map tmpMap = (Map)queueMap.get(mt.getMoID());
tmpMap.put(mt.getCurPos()+"", mt);
}
else{
Map tmpMap = new HashMap();
tmpMap.put(mt.getCurPos()+"", mt);
queueMap.put(mt.getMoID(), tmpMap);
}
if( !keyMap.containsKey(mt.getMoID()) ){
keyMap.put(mt.getMoID(), "1");
}
}
/**
* 更新或者删除serialcache里面保存的curpos、moID,其规则是:
* 1.如果当前mt已经是顺序下发过程中的最后一条mt,则删除serialcache中的相关记录
* 2.如果当前mt并不是最后一条顺序下发的记录,则更新serialcache中的记录,以猎取匹配下一条顺序mt
* @param mt
*/
public void addKey(MT mt){//mt.getTotal()表征该次总共下发多少条mt;mt.getCurPos()表征当前是所有mt中第几条
if( mt.getCurPos() == mt.getTotal() ){//如果相等说明是下发的多条mt中最后一条
int next = Integer.parseInt((String)keyMap.get(mt.getMoID()));//取出上一个同moID的mt压入缓存时的(mt.getCurPos()+1)
if( next == mt.getCurPos() ){//如果匹配上后则删除所有的缓存内容
keyMap.remove(mt.getMoID());
queueMap.remove(mt.getMoID());
validKey.remove(mt.getMoID());
return;
}
}
//保存下一个应该顺序下发的mt的curpos值
keyMap.put(mt.getMoID(), (mt.getCurPos()+1)+"");
if( queueMap.containsKey(mt.getMoID()) ){
Map tmpMap = (Map)queueMap.get(mt.getMoID());
if( tmpMap.containsKey((mt.getCurPos()+1)+"") && !validKey.contains(mt.getMoID())){
ok = true;
validKey.add(mt.getMoID());
if( validKey.size() > SIZE ){
validKey.removeElementAt(0);
}
}
}
}
/**返回是不是多条mt按顺序下发中下一条要发的mt,检查规则是上一条已经按顺序发送的mt的Curpos + 1 = 当前mt的Curpos */
public boolean isNext(MT mt){
if( keyMap.containsKey(mt.getMoID()) ){
int next = Integer.parseInt((String)keyMap.get(mt.getMoID()));
if( next == mt.getCurPos() ){
return true;
}
}
return false;
}
public MT getMT(){
MT mt = null;
if( validKey.size() > 0 ){
String moID = (String)validKey.elementAt(0);
Map tmpMap = (Map)queueMap.get(moID);
mt = (MT)tmpMap.get((String)keyMap.get(moID));
if( !tmpMap.containsKey((mt.getCurPos()+1)+"") ){
validKey.remove(0);
ok = false;
}
}
return mt;
}
class InnerMap extends LinkedHashMap {
private static final long serialVersionUID=1L;
private int size = 0;
public InnerMap(int size) {
this.size = size;
}
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > size;
}
}
public String toString(){
return
"queueMap.size - " + queueMap.keySet().size() + " " +
"queueMap.innerMap.size - " +
(queueMap.keySet().size()>0?((Map)queueMap.get(queueMap.keySet().iterator().next())).size():0) +
" keyMap.size - " + keyMap.keySet().size() +
" validKey.size - " + validKey.size() + " ok - " + ok;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -