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

📄 serialcache.java

📁 中国联通短信通信协议
💻 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 + -