345
|
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");
|
350
|
66 DataSegment.get(nowTask.getManagerKey()).shutdown();
|
345
|
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 } |