JAVA技巧辅导(客户访问限制管理器)
来源:优易学  2011-11-20 14:05:17   【优易学:中国教育考试门户网】   资料下载   IT书店

  前段时间开发短信收发系统,遇到一个问题,就是有n个对象都可以通过Mobile对象发短信,但同一时刻只允许一个对象进行操作。所以设计了一个客户限制管理器的对象来解决,但由于种种原因没有用到实际系统中。后来经过仔细考虑,发现它不仅可以用于端口的管理,还可用于其他需要针对客户访问数量进行限制的各种服务中去。----这里的“客户”是指要操作该管理器的对象
  /**
  * 客户限制管理器的抽象类
  * 此抽象类实现了对客户访问的限制,当一个客户访问该服务时,可以通过halt(long guestid)方法阻止其他客户进行
  * 访问,防止多个客户同时访问产生的冲突。例如:对通讯端口的访问等。
  */
  public abstract class GuestManager {
  /**
  * 时间:一分钟
  */
  protected static final long ONE_MINUTE = 60L * 1000L;
  /**
  * 时间:一小时
  */
  protected static final long ONE_HOUR = 60L * ONE_MINUTE;
  /**
  * 自动清理客户记录的间隔时间
  */
  private long cleanInterval;
  /**
  * 客户记录<客户标识,最近访问时间>
  */
  private Hashtable<String, String> guests;
  /**
  * 当前限制的客户
  */
  private long limitGuest;
  /**
  * 自动清除过期客户的线程
  */
  private Thread autoCleanThread;
  /**
  * 客户注册
  *
  * @return 返回分配给客户端的唯一标识,如果注册失败,返回-1
  */
  public long login() {
  long guestid = -1L;
  // 增加客户记录
  Hashtable<String, String> guests = getGuests();
  if (guests != null) {
  guestid = System.currentTimeMillis();
  guests.put("" + guestid, "" + guestid);
  update(guestid);
  // if (guests.size() == 1)
  // connect();
  }
  return guestid;
  }
  /**
  * 检查客户是否已经注册
  *
  * @param guestid
  * 客户标识
  * @return 如果客户已经注册返回true,否则返回false
  */
  public boolean isLogin(long guestid) {
  boolean flag = false;
  if (guestid > 0) {
  Hashtable<String, String> guests = getGuests();
  if (guests != null)
  flag = guests.containsKey("" + guestid);
  if (flag)
  update(guestid);
  }// end if (guestid > 0)
  return flag;
  }
  /**
  * 注销客户
  * 如果仍有其他客户在使用此对象,则仅仅注销guestid客户,否则调用disconnect()方法关闭连接。
  *
  * @param guestid
  * 客户标识
  * @return 返回是否成功注销
  */
  public void logout(long guestid) {
  Hashtable<String, String> guests = getGuests();
  if (guests != null) {
  if (guestid > 0 && guests.containsKey("" + guestid)) {
  guests.remove("" + guestid);
  }// end if (guestid > 0 && getGuests().containsKey("" +
  // guestid))
  }// end if (guests != null)
  }
  /**
  * 限制
  * 如果某一客户调用了该方法,那么其他客户将无法访问,直至该客户调用resume()释放。
  *
  * @param guestid
  * 中断标识
  * @return 返回是否成功中断
  */
  public boolean limit(long guestid) {
  boolean flag = false;
  if (isLogin(guestid)) {
  update(guestid);
  if (isLimit(guestid))
  return flag;
  limitGuest = guestid;
  flag = true;
  }// end if (isLogin(guestid))
  return flag;
  }
  /**
  * 释放
  *
  * @param guestid
  * 客户标识
  * @return 返回是否释放成功
  */
  public boolean resume(long guestid) {
  boolean flag = false;
  if (isLogin(guestid)) {
  update(guestid);
  if (limitGuest == guestid) {
  limitGuest = -1L;
  }// end if(haltGuest == guestid)
  flag = !isLimit();
  }
  return flag;
  }
  /**
  * 是否限制其他客户调用
  *
  * @return 返回是否限制其他客户调用
  */
  protected boolean isLimit() {
  boolean flag = false;
  if (limitGuest > 0) {
  long lasttime = Long.parseLong((getGuests().get(
  "" + limitGuest)));
  if (lasttime > 0) {
  // 如果10分钟内无响应,则注释放该客户的中断
  long time = System.currentTimeMillis() - 10L
  * ONE_MINUTE;
  if (time < lasttime)
  flag = true;
  else
  limitGuest = -1;
  }
  }// end if(this.id <= 0)
  return flag;
  }
  /**
  * 该客户是否被限制访问
  *
  * @param haltId
  * 客户标识
  * @return 返回true表示禁止访问,false表示可以访问
  */

[1] [2] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训