Mercurial > hg > Database > Alice
diff src/main/java/alice/topology/manager/keeparive/TaskExecuter.java @ 345:8f71c3e6f11d
Change directory structure Maven standard
author | sugi |
---|---|
date | Wed, 16 Apr 2014 18:26:07 +0900 |
parents | |
children | 388e7d4b0624 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/topology/manager/keeparive/TaskExecuter.java Wed Apr 16 18:26:07 2014 +0900 @@ -0,0 +1,128 @@ +package alice.topology.manager.keeparive; + +import alice.codesegment.CodeSegment; +import alice.datasegment.CommandType; +import alice.datasegment.DataSegment; +import alice.datasegment.Receiver; + +public class TaskExecuter extends CodeSegment { + private Receiver info = ids.create(CommandType.TAKE); + private TaskInfo nowTask; + private boolean sleepFlag = false; + private boolean skipFlag = false; + private long startTime = 0; + private long remainingTime = 0; + private static TaskExecuter instance = new TaskExecuter(); + + private TaskExecuter() {} + public static TaskExecuter getInstance() { + return instance; + } + + public void setKey() { + ids.init(); + info.setKey("_WAITINGLIST"); + } + + @Override + public synchronized void run() { + ListManager list = info.asClass(ListManager.class); + if (list.getTaskList().size() == 0){ + remainingTime = 0; + ods.update("_WAITINGLIST", list); + } else { + nowTask = list.getTaskList().poll(); + ods.update("_WAITINGLIST", list); + + if (skipFlag) { + skipFlag = false; + nowTask.setSleepTime(remainingTime + nowTask.getSleepTime()); + remainingTime = 0; + } + + startTime = System.currentTimeMillis(); + System.out.println(nowTask.getSleepTime()+" "+nowTask.getType()); + if (nowTask.getSleepTime() != 0){ + sleepFlag = true; + try { + wait(nowTask.getSleepTime()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + sleepFlag = false; + } + + if (!skipFlag){ + // ping or close + if (nowTask.getType() == TaskType.PING) { + ods.ping(nowTask.getManagerKey(), nowTask.getReturnKey()); + TaskInfo task = new TaskInfo(TaskType.CLOSE); + task.setInfo(nowTask.getManagerKey(), 10 * 1000); + ods.put("_TASKINFO", task); + new RespondPing(nowTask.getReturnKey()); + } else if (nowTask.getType() == TaskType.CLOSE) { + // no response from the Remote DataSegment. So close this connection. + System.out.println("SHOTDOWN"); + DataSegment.get(nowTask.getManagerKey()).close(); + } + } + nowTask = null; + startTime = 0; + } + setKey(); + } + + public synchronized void skip() { + if (sleepFlag){ + skipFlag = true; + if (startTime == 0){ + remainingTime = nowTask.getSleepTime(); + } else { + remainingTime = nowTask.getSleepTime() - (System.currentTimeMillis() - startTime); + } + nowTask = null; + notify(); + } + } + + public synchronized void ignore() { + if (sleepFlag){ + skipFlag = true; + remainingTime = 0; + nowTask = null; + notify(); + } + } + + public synchronized TaskInfo getNowTask() { + return nowTask; + } + + // only use in ListManagerTest + public synchronized void setNowTask(TaskInfo info) { + nowTask = info; + } + + public synchronized long getRemainingTime() { + if (sleepFlag) { + if (startTime !=0) { + return nowTask.getSleepTime() - (System.currentTimeMillis() - startTime); + } else { + return nowTask.getSleepTime(); + } + } else { + return remainingTime; + } + } + + public boolean compareNowTask(TaskInfo task) { + if (nowTask != null){ + if (nowTask.getType().equals(task.getType()) + && nowTask.getManagerKey().equals(task.getManagerKey())){ + return true; + } + } + return false; + } + +} \ No newline at end of file