1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.springframework.extensions.surf.task;
20
21 import org.apache.commons.logging.Log;
22 import org.apache.commons.logging.LogFactory;
23
24
25
26
27
28
29
30 public class TaskWorkerThread extends Thread
31 {
32 private static Log logger = LogFactory.getLog(TaskWorkerThread.class);
33
34 private AbstractTask task = null;
35 private TaskManager taskManager = null;
36
37 public TaskWorkerThread(TaskManager taskManager)
38 {
39 this.taskManager = taskManager;
40 }
41
42 public AbstractTask getTask()
43 {
44 return this.task;
45 }
46
47 public void setTask(AbstractTask task)
48 {
49 this.task = task;
50 }
51
52 public Object getMutex()
53 {
54 return taskManager.getClass();
55 }
56
57 public void run()
58 {
59 while (true)
60 {
61 try
62 {
63 synchronized (getMutex())
64 {
65
66 getMutex().wait();
67
68
69 AbstractTask task = (AbstractTask) taskManager.getTaskQueue().peek();
70 if (task != null)
71 {
72 task = (AbstractTask) taskManager.getTaskQueue().poll();
73
74
75 if (logger.isDebugEnabled())
76 {
77 logger.debug("Found a job to start (" + task.getName() + ")");
78 }
79
80
81 setTask(task);
82 }
83 }
84 }
85 catch (InterruptedException ie)
86 {
87 }
88
89
90 if (getTask() != null)
91 {
92
93 getTask().progress = 0;
94 getTask().setStatus("Starting...");
95
96
97 getTask().isRunning = true;
98 getTask().isFinished = false;
99 getTask().isError = false;
100 getTask().isSuccess = false;
101
102 if (logger.isDebugEnabled())
103 {
104 logger.debug("Running job " + getTask().getId());
105 }
106
107 try
108 {
109 getTask().execute();
110 getTask().isSuccess = true;
111 }
112 catch (Throwable t)
113 {
114 getTask().throwable = t;
115 t.printStackTrace();
116 getTask().isError = true;
117 }
118
119 if (getTask().isCancelled() && logger.isDebugEnabled())
120 {
121 getTask().isSuccess = false;
122
123 logger.debug("Finished with a cancelled job");
124 }
125
126
127 if (logger.isDebugEnabled())
128 {
129 logger.debug("Completing job " + getTask().getId());
130 }
131
132 getTask().setStatus("Finished");
133 getTask().isFinished = true;
134 getTask().isRunning = false;
135
136
137 setTask(null);
138 }
139 }
140 }
141 }