xuxueli 6 лет назад
Родитель
Сommit
2f640f138a

+ 29 - 33
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java Просмотреть файл

@@ -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) );