public class TaskCache implements API, Runnable {
public TaskCache() {
startSchedule();
}
private Map<String, List<Task>> taskMap = new HashMap<String, List<Task>>();
private final String ID = "ID_";
private final String HOST = "HOST_";
private final String IP = "IP_";
private ConcurrentMap<Long, Task> timeMap = new ConcurrentHashMap<Long, Task>();
public Map<Long, Task> getTimeMap() {
return timeMap;
}
public void put(Task task, Long time) {
synchronized(taskMap) {
timeMap.put(time,task);
if (taskMap.containsKey(ID + task.getId())) {
taskMap.get(ID + task.getId()).add(task);
} else {
List<Task> idTask = new ArrayList<Task>();
idTask.add(task);
taskMap.put(ID + task.getId(), idTask);
}
if (taskMap.containsKey(IP + task.getIp())) {
taskMap.get(IP + task.getIp()).add(task);
} else {
List<Task> ipTask = new ArrayList<Task>();
ipTask.add(task);
taskMap.put(IP + task.getIp(), ipTask);
}
if (taskMap.containsKey(HOST + task.getHost())) {
taskMap.get(HOST + task.getHost()).add(task);
} else {
List<Task> hostTask = new ArrayList<Task>();
hostTask.add(task);
taskMap.put(HOST + task.getHost(), hostTask);
}
}
}
public void add(Task task, int expiredTime) {
try {
synchronized(taskMap) {
System.out.println("task map size : "+taskMap.size());
put(task, expiredTime + System.currentTimeMillis());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public List<Task> queryById(String id) {
synchronized(taskMap) {
return taskMap.get(ID + id);
}
}
public List<Task> queryByIp(String ip) {
synchronized(taskMap) {
return taskMap.get(IP + ip);
}
}
public List<Task> queryByHost(String host) {
synchronized(taskMap) {
return taskMap.get(HOST + host);
}
}
public void remove(Task task) {
try {
synchronized(taskMap) {
List idList = taskMap.get(ID + task.getId());
if (idList!=null&&idList.contains(task)) {
idList.remove(task);
if (idList.size() == 0) {
System.out.println("remove ipList " + ID + task.getId());
taskMap.remove(ID + task.getId
());
}
System.out.println(task.toString() + " has removed from idList");
} else {
System.out.println("no operation idList");
}
List ipList = taskMap.get(IP + task.getIp());
if (ipList!=null&& ipList.contains(task)) {
ipList.remove(task);
System.out.println(task.toString() + " has removed ipList");
if (ipList.size() == 0) {
System.out.println("remove ipList " + IP + task.getIp());
taskMap.remove(IP + task.getIp());
}
} else {
System.out.println("no operation ipList");
}
List hostList = taskMap.get(HOST + task.getHost());
if (hostList!=null &&hostList.contains(task)) {
hostList.remove(task);
System.out.println(task.toString() + " has removed hostList");
if (hostList.size() == 0) {
System.out.println("remove hostlist " + HOST + task.getHost());
taskMap.remove(HOST + task.getHost());
}
} else {
System.out.println("no operation hostList");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
try {
for (Long key : timeMap.keySet()) {
System.out.println("prepare remove task "+key);
long current = System.currentTimeMillis();
if (current > key) {
Task t = timeMap.get(key);
System.out.println("remove t");
remove(t);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void startSchedule() {
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(this, 0, 2, TimeUnit.SECONDS);
}
}
/**
* Created by baidu on 15/9/23.
*/
public class Task {
private String id;
private String ip;
private String host;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
@Override
public String toString() {
return "Task{" +
"id='" + id + '\'' +
", ip='" + ip + '\'' +
", host='" + host + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Task task = (Task) o;
if (!id.equals(task.id)) {
return false;
}
if (!ip.equals(task.ip)) {
return false;
}
return host.equals(task.host);
}
@Override
public int hashCode() {
int result = id.hashCode();
result = 31 * result + ip.hashCode();
result = 31 * result + host.hashCode();
return result;
}
}
/**
* Created by baidu on 15/9/24.
*/
public class TaskFactory {
public static Task buildTask(){
Task task = new Task();
task.setId(UUID.randomUUID().toString());
task.setHost(UUID.randomUUID().toString());
task.setIp(UUID.randomUUID().toString());
return task;
}
public static void main(String[] args) {
System.out.println("haha");
}
}
/**
* Created by baidu on 15/9/23.
*/
public interface API {
public void add(Task task ,int expiredTime);
public List<Task> queryById(String id);
public List<Task> queryByIp(String ip);
public List<Task> queryByHost(String host);
}
public class CacheTest {
public static void main(String[] args) {
API api = new TaskCache();
while (true){
api.add(TaskFactory.buildTask(),5000);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class TaskCache implements API, Runnable { public TaskCache() { startSchedule(); } private Map> taskMap = new HashMap>(); private final String ID = "ID_"; private