|
@@ -66,16 +66,14 @@ public class JobScheduleHelper {
|
66
|
66
|
|
67
|
67
|
// 1、预读5s内调度任务
|
68
|
68
|
long maxNextTime = System.currentTimeMillis() + 5000;
|
69
|
|
- long nowTime = System.currentTimeMillis();
|
70
|
69
|
List<XxlJobInfo> scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(maxNextTime);
|
71
|
70
|
if (scheduleList!=null && scheduleList.size()>0) {
|
72
|
71
|
// 2、推送时间轮
|
73
|
72
|
for (XxlJobInfo jobInfo: scheduleList) {
|
74
|
73
|
|
75
|
74
|
// 时间轮刻度计算
|
76
|
|
- int ringSecond = -1;
|
77
|
|
- if (jobInfo.getTriggerNextTime() < nowTime - 5000) { // 过期超5s:本地忽略,当前时间开始计算下次触发时间
|
78
|
|
- ringSecond = -1;
|
|
75
|
+ if (System.currentTimeMillis() > jobInfo.getTriggerNextTime() + 5000) {
|
|
76
|
+ // 过期超5s:本地忽略,当前时间开始计算下次触发时间
|
79
|
77
|
|
80
|
78
|
jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
|
81
|
79
|
jobInfo.setTriggerNextTime(
|
|
@@ -83,8 +81,12 @@ public class JobScheduleHelper {
|
83
|
81
|
.getNextValidTimeAfter(new Date())
|
84
|
82
|
.getTime()
|
85
|
83
|
);
|
86
|
|
- } else if (jobInfo.getTriggerNextTime() < nowTime) { // 过期5s内:立即触发一次,当前时间开始计算下次触发时间
|
87
|
|
- ringSecond = (int)((nowTime/1000)%60);
|
|
84
|
+
|
|
85
|
+ // pass
|
|
86
|
+ continue;
|
|
87
|
+
|
|
88
|
+ } else if (System.currentTimeMillis() > jobInfo.getTriggerNextTime()) {
|
|
89
|
+ // 过期5s内 :立即触发一次,当前时间开始计算下次触发时间
|
88
|
90
|
|
89
|
91
|
jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
|
90
|
92
|
jobInfo.setTriggerNextTime(
|
|
@@ -92,8 +94,15 @@ public class JobScheduleHelper {
|
92
|
94
|
.getNextValidTimeAfter(new Date())
|
93
|
95
|
.getTime()
|
94
|
96
|
);
|
95
|
|
- } else { // 未过期:正常触发,递增计算下次触发时间
|
96
|
|
- ringSecond = (int)((jobInfo.getTriggerNextTime()/1000)%60);
|
|
97
|
+
|
|
98
|
+ // do trigger
|
|
99
|
+ JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.CRON, -1, null, null);
|
|
100
|
+
|
|
101
|
+ logger.debug(">>>>>>>>>>> xxl-job, push trigger : jobId = " + jobInfo.getId() );
|
|
102
|
+ } else {
|
|
103
|
+ // 未过期:正常触发,递增计算下次触发时间
|
|
104
|
+
|
|
105
|
+ int ringSecond = (int)((jobInfo.getTriggerNextTime()/1000)%60);
|
97
|
106
|
|
98
|
107
|
jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
|
99
|
108
|
jobInfo.setTriggerNextTime(
|
|
@@ -101,20 +110,18 @@ public class JobScheduleHelper {
|
101
|
110
|
.getNextValidTimeAfter(new Date(jobInfo.getTriggerNextTime()))
|
102
|
111
|
.getTime()
|
103
|
112
|
);
|
104
|
|
- }
|
105
|
|
- if (ringSecond == -1) {
|
106
|
|
- continue;
|
107
|
|
- }
|
108
|
113
|
|
109
|
|
- // push async ring
|
110
|
|
- List<Integer> ringItemData = ringData.get(ringSecond);
|
111
|
|
- if (ringItemData == null) {
|
112
|
|
- ringItemData = new ArrayList<Integer>();
|
113
|
|
- ringData.put(ringSecond, ringItemData);
|
|
114
|
+ // push async ring
|
|
115
|
+ List<Integer> ringItemData = ringData.get(ringSecond);
|
|
116
|
+ if (ringItemData == null) {
|
|
117
|
+ ringItemData = new ArrayList<Integer>();
|
|
118
|
+ ringData.put(ringSecond, ringItemData);
|
|
119
|
+ }
|
|
120
|
+ ringItemData.add(jobInfo.getId());
|
|
121
|
+
|
|
122
|
+ logger.debug(">>>>>>>>>>> xxl-job, push time-ring : " + ringSecond + " = " + Arrays.asList(ringItemData) );
|
114
|
123
|
}
|
115
|
|
- ringItemData.add(jobInfo.getId());
|
116
|
124
|
|
117
|
|
- logger.debug(">>>>>>>>>>> xxl-job, push time-ring : " + ringSecond + " = " + Arrays.asList(ringItemData) );
|
118
|
125
|
}
|
119
|
126
|
|
120
|
127
|
// 3、更新trigger信息
|
|
@@ -181,29 +188,18 @@ public class JobScheduleHelper {
|
181
|
188
|
}
|
182
|
189
|
}
|
183
|
190
|
|
184
|
|
- int lastSecond = -1;
|
185
|
191
|
while (!ringThreadToStop) {
|
186
|
192
|
|
187
|
193
|
try {
|
188
|
194
|
// second data
|
189
|
195
|
List<Integer> ringItemData = new ArrayList<>();
|
190
|
|
- int nowSecond = (int)((System.currentTimeMillis()/1000)%60); // 避免处理耗时太长,跨过刻度;
|
191
|
|
- if (lastSecond == -1) {
|
192
|
|
- lastSecond = (nowSecond+59)%60;
|
193
|
|
- }
|
194
|
|
- for (int i = 1; i <=60; i++) {
|
195
|
|
- int secondItem = (lastSecond+i)%60;
|
196
|
|
-
|
197
|
|
- List<Integer> tmpData = ringData.remove(secondItem);
|
|
196
|
+ int nowSecond = Calendar.getInstance().get(Calendar.SECOND); // 避免处理耗时太长,跨过刻度,向前校验一个刻度;
|
|
197
|
+ for (int i = 0; i < 2; i++) {
|
|
198
|
+ List<Integer> tmpData = ringData.remove( (nowSecond+60-i)%60 );
|
198
|
199
|
if (tmpData != null) {
|
199
|
200
|
ringItemData.addAll(tmpData);
|
200
|
201
|
}
|
201
|
|
-
|
202
|
|
- if (secondItem == nowSecond) {
|
203
|
|
- break;
|
204
|
|
- }
|
205
|
202
|
}
|
206
|
|
- lastSecond = nowSecond;
|
207
|
203
|
|
208
|
204
|
// ring trigger
|
209
|
205
|
logger.debug(">>>>>>>>>>> xxl-job, time-ring beat : " + nowSecond + " = " + Arrays.asList(ringItemData) );
|