前段时间开发短信收发系统,遇到一个问题,就是有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表示可以访问
*/
责任编辑:小草