在下面这个帖子中有一个好的回复,特此保存,不致淹没
package com.im.controler;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import com.im.context.IMContext;
import com.im.dto.Visitor;
public class VisitorTimeOutControler {
private static Timer timer=new Timer();
private static long delay;
private static TimerTask timerTask =new TimerTask() {
@Override
public void run() {
execute();
}
};
/**
* 超时检查
*/
private static void execute() {
for (String key : IMContext.getVisitorKeys()) {
Visitor visitor = IMContext.getVisitor(key);
Date endDate = null;
try {
endDate = IMContext.dateFormat.parse(visitor.getEndTime() == null
|| visitor.getEndTime().equals("") ? visitor
.getStartTime() : visitor.getEndTime());
} catch (ParseException e) {
e.printStackTrace();
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(endDate);
long offset = System.currentTimeMillis()
- calendar.getTimeInMillis();
if (offset > 0.5 * 60 * 1000) {
// 等待超时
System.out.println("移除过期对话!!--->:" + visitor.getVid());
IMContext.removeVisitor(visitor.getIp());
continue;
} else {
System.out.println(offset);
}
}
}
/**
* 启动超时检查
* @param delay
*/
public static void start(long delay){
VisitorTimeOutControler.setDelay(delay);
timer.schedule(timerTask, VisitorTimeOutControler.delay);
System.out.println("Visitor超时检查启动...");
}
/**
* 返回延期时间
* @return long
*/
public static long getDelay() {
return VisitorTimeOutControler.delay;
}
/**
* 设置延期时间
* @param delay
*/
public static void setDelay(long delay) {
VisitorTimeOutControler.delay = delay;
}
}