|
@@ -27,7 +27,8 @@ public class JobScheduleHelper {
|
27
|
27
|
|
28
|
28
|
private Thread scheduleThread;
|
29
|
29
|
private Thread ringThread;
|
30
|
|
- private volatile boolean toStop = false;
|
|
30
|
+ private volatile boolean scheduleThreadToStop = false;
|
|
31
|
+ private volatile boolean ringThreadToStop = false;
|
31
|
32
|
private volatile static Map<Integer, List<Integer>> ringData = new ConcurrentHashMap<>();
|
32
|
33
|
|
33
|
34
|
public void start(){
|
|
@@ -40,13 +41,13 @@ public class JobScheduleHelper {
|
40
|
41
|
try {
|
41
|
42
|
TimeUnit.MILLISECONDS.sleep(5000 - System.currentTimeMillis()%1000 );
|
42
|
43
|
} catch (InterruptedException e) {
|
43
|
|
- if (!toStop) {
|
|
44
|
+ if (!scheduleThreadToStop) {
|
44
|
45
|
logger.error(e.getMessage(), e);
|
45
|
46
|
}
|
46
|
47
|
}
|
47
|
48
|
logger.info(">>>>>>>>> init xxl-job admin scheduler success.");
|
48
|
49
|
|
49
|
|
- while (!toStop) {
|
|
50
|
+ while (!scheduleThreadToStop) {
|
50
|
51
|
|
51
|
52
|
// 扫描任务
|
52
|
53
|
long start = System.currentTimeMillis();
|
|
@@ -127,7 +128,7 @@ public class JobScheduleHelper {
|
127
|
128
|
|
128
|
129
|
conn.commit();
|
129
|
130
|
} catch (Exception e) {
|
130
|
|
- if (!toStop) {
|
|
131
|
+ if (!scheduleThreadToStop) {
|
131
|
132
|
logger.error(">>>>>>>>>>> xxl-job, JobScheduleHelper#scheduleThread error:{}", e);
|
132
|
133
|
}
|
133
|
134
|
} finally {
|
|
@@ -152,7 +153,7 @@ public class JobScheduleHelper {
|
152
|
153
|
TimeUnit.MILLISECONDS.sleep(1000 - System.currentTimeMillis()%1000);
|
153
|
154
|
}
|
154
|
155
|
} catch (InterruptedException e) {
|
155
|
|
- if (!toStop) {
|
|
156
|
+ if (!scheduleThreadToStop) {
|
156
|
157
|
logger.error(e.getMessage(), e);
|
157
|
158
|
}
|
158
|
159
|
}
|
|
@@ -175,13 +176,13 @@ public class JobScheduleHelper {
|
175
|
176
|
try {
|
176
|
177
|
TimeUnit.MILLISECONDS.sleep(1000 - System.currentTimeMillis()%1000 );
|
177
|
178
|
} catch (InterruptedException e) {
|
178
|
|
- if (!toStop) {
|
|
179
|
+ if (!ringThreadToStop) {
|
179
|
180
|
logger.error(e.getMessage(), e);
|
180
|
181
|
}
|
181
|
182
|
}
|
182
|
183
|
|
183
|
184
|
int lastSecond = -1;
|
184
|
|
- while (!toStop) {
|
|
185
|
+ while (!ringThreadToStop) {
|
185
|
186
|
|
186
|
187
|
try {
|
187
|
188
|
// second data
|
|
@@ -216,7 +217,7 @@ public class JobScheduleHelper {
|
216
|
217
|
ringItemData.clear();
|
217
|
218
|
}
|
218
|
219
|
} catch (Exception e) {
|
219
|
|
- if (!toStop) {
|
|
220
|
+ if (!ringThreadToStop) {
|
220
|
221
|
logger.error(">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread error:{}", e);
|
221
|
222
|
}
|
222
|
223
|
}
|
|
@@ -225,7 +226,7 @@ public class JobScheduleHelper {
|
225
|
226
|
try {
|
226
|
227
|
TimeUnit.MILLISECONDS.sleep(1000 - System.currentTimeMillis()%1000);
|
227
|
228
|
} catch (InterruptedException e) {
|
228
|
|
- if (!toStop) {
|
|
229
|
+ if (!ringThreadToStop) {
|
229
|
230
|
logger.error(e.getMessage(), e);
|
230
|
231
|
}
|
231
|
232
|
}
|
|
@@ -239,23 +240,61 @@ public class JobScheduleHelper {
|
239
|
240
|
}
|
240
|
241
|
|
241
|
242
|
public void toStop(){
|
242
|
|
- toStop = true;
|
243
|
243
|
|
244
|
|
- // interrupt and wait
|
245
|
|
- scheduleThread.interrupt();
|
|
244
|
+ // 1、stop schedule
|
|
245
|
+ scheduleThreadToStop = true;
|
246
|
246
|
try {
|
247
|
|
- scheduleThread.join();
|
|
247
|
+ TimeUnit.SECONDS.sleep(1); // wait
|
248
|
248
|
} catch (InterruptedException e) {
|
249
|
249
|
logger.error(e.getMessage(), e);
|
250
|
250
|
}
|
|
251
|
+ if (scheduleThread.getState() != Thread.State.TERMINATED){
|
|
252
|
+ // interrupt and wait
|
|
253
|
+ scheduleThread.interrupt();
|
|
254
|
+ try {
|
|
255
|
+ scheduleThread.join();
|
|
256
|
+ } catch (InterruptedException e) {
|
|
257
|
+ logger.error(e.getMessage(), e);
|
|
258
|
+ }
|
|
259
|
+ }
|
251
|
260
|
|
252
|
|
- // interrupt and wait
|
253
|
|
- ringThread.interrupt();
|
|
261
|
+ // if has ring data
|
|
262
|
+ boolean hasRingData = false;
|
|
263
|
+ if (!ringData.isEmpty()) {
|
|
264
|
+ for (int second : ringData.keySet()) {
|
|
265
|
+ List<Integer> tmpData = ringData.get(second);
|
|
266
|
+ if (tmpData!=null && tmpData.size()>0) {
|
|
267
|
+ hasRingData = true;
|
|
268
|
+ break;
|
|
269
|
+ }
|
|
270
|
+ }
|
|
271
|
+ }
|
|
272
|
+ if (hasRingData) {
|
|
273
|
+ try {
|
|
274
|
+ TimeUnit.SECONDS.sleep(8);
|
|
275
|
+ } catch (InterruptedException e) {
|
|
276
|
+ logger.error(e.getMessage(), e);
|
|
277
|
+ }
|
|
278
|
+ }
|
|
279
|
+
|
|
280
|
+ // stop ring (wait job-in-memory stop)
|
|
281
|
+ ringThreadToStop = true;
|
254
|
282
|
try {
|
255
|
|
- ringThread.join();
|
|
283
|
+ TimeUnit.SECONDS.sleep(1);
|
256
|
284
|
} catch (InterruptedException e) {
|
257
|
285
|
logger.error(e.getMessage(), e);
|
258
|
286
|
}
|
|
287
|
+ if (ringThread.getState() != Thread.State.TERMINATED){
|
|
288
|
+ // interrupt and wait
|
|
289
|
+ ringThread.interrupt();
|
|
290
|
+ try {
|
|
291
|
+ ringThread.join();
|
|
292
|
+ } catch (InterruptedException e) {
|
|
293
|
+ logger.error(e.getMessage(), e);
|
|
294
|
+ }
|
|
295
|
+ }
|
|
296
|
+
|
|
297
|
+ logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper stop");
|
259
|
298
|
}
|
260
|
299
|
|
261
|
300
|
}
|