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