comparison 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
comparison
equal deleted inserted replaced
344:9f97ec18f8c5 345:8f71c3e6f11d
1 package alice.topology.manager.keeparive;
2
3 import alice.codesegment.CodeSegment;
4 import alice.datasegment.CommandType;
5 import alice.datasegment.DataSegment;
6 import alice.datasegment.Receiver;
7
8 public class TaskExecuter extends CodeSegment {
9 private Receiver info = ids.create(CommandType.TAKE);
10 private TaskInfo nowTask;
11 private boolean sleepFlag = false;
12 private boolean skipFlag = false;
13 private long startTime = 0;
14 private long remainingTime = 0;
15 private static TaskExecuter instance = new TaskExecuter();
16
17 private TaskExecuter() {}
18 public static TaskExecuter getInstance() {
19 return instance;
20 }
21
22 public void setKey() {
23 ids.init();
24 info.setKey("_WAITINGLIST");
25 }
26
27 @Override
28 public synchronized void run() {
29 ListManager list = info.asClass(ListManager.class);
30 if (list.getTaskList().size() == 0){
31 remainingTime = 0;
32 ods.update("_WAITINGLIST", list);
33 } else {
34 nowTask = list.getTaskList().poll();
35 ods.update("_WAITINGLIST", list);
36
37 if (skipFlag) {
38 skipFlag = false;
39 nowTask.setSleepTime(remainingTime + nowTask.getSleepTime());
40 remainingTime = 0;
41 }
42
43 startTime = System.currentTimeMillis();
44 System.out.println(nowTask.getSleepTime()+" "+nowTask.getType());
45 if (nowTask.getSleepTime() != 0){
46 sleepFlag = true;
47 try {
48 wait(nowTask.getSleepTime());
49 } catch (InterruptedException e) {
50 e.printStackTrace();
51 }
52 sleepFlag = false;
53 }
54
55 if (!skipFlag){
56 // ping or close
57 if (nowTask.getType() == TaskType.PING) {
58 ods.ping(nowTask.getManagerKey(), nowTask.getReturnKey());
59 TaskInfo task = new TaskInfo(TaskType.CLOSE);
60 task.setInfo(nowTask.getManagerKey(), 10 * 1000);
61 ods.put("_TASKINFO", task);
62 new RespondPing(nowTask.getReturnKey());
63 } else if (nowTask.getType() == TaskType.CLOSE) {
64 // no response from the Remote DataSegment. So close this connection.
65 System.out.println("SHOTDOWN");
66 DataSegment.get(nowTask.getManagerKey()).close();
67 }
68 }
69 nowTask = null;
70 startTime = 0;
71 }
72 setKey();
73 }
74
75 public synchronized void skip() {
76 if (sleepFlag){
77 skipFlag = true;
78 if (startTime == 0){
79 remainingTime = nowTask.getSleepTime();
80 } else {
81 remainingTime = nowTask.getSleepTime() - (System.currentTimeMillis() - startTime);
82 }
83 nowTask = null;
84 notify();
85 }
86 }
87
88 public synchronized void ignore() {
89 if (sleepFlag){
90 skipFlag = true;
91 remainingTime = 0;
92 nowTask = null;
93 notify();
94 }
95 }
96
97 public synchronized TaskInfo getNowTask() {
98 return nowTask;
99 }
100
101 // only use in ListManagerTest
102 public synchronized void setNowTask(TaskInfo info) {
103 nowTask = info;
104 }
105
106 public synchronized long getRemainingTime() {
107 if (sleepFlag) {
108 if (startTime !=0) {
109 return nowTask.getSleepTime() - (System.currentTimeMillis() - startTime);
110 } else {
111 return nowTask.getSleepTime();
112 }
113 } else {
114 return remainingTime;
115 }
116 }
117
118 public boolean compareNowTask(TaskInfo task) {
119 if (nowTask != null){
120 if (nowTask.getType().equals(task.getType())
121 && nowTask.getManagerKey().equals(task.getManagerKey())){
122 return true;
123 }
124 }
125 return false;
126 }
127
128 }