Selaa lähdekoodia

update document

xuxueli 6 vuotta sitten
vanhempi
commit
2f640f138a

+ 29 - 33
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java Näytä tiedosto

66
 
66
 
67
                         // 1、预读5s内调度任务
67
                         // 1、预读5s内调度任务
68
                         long maxNextTime = System.currentTimeMillis() + 5000;
68
                         long maxNextTime = System.currentTimeMillis() + 5000;
69
-                        long nowTime = System.currentTimeMillis();
70
                         List<XxlJobInfo> scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(maxNextTime);
69
                         List<XxlJobInfo> scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(maxNextTime);
71
                         if (scheduleList!=null && scheduleList.size()>0) {
70
                         if (scheduleList!=null && scheduleList.size()>0) {
72
                             // 2、推送时间轮
71
                             // 2、推送时间轮
73
                             for (XxlJobInfo jobInfo: scheduleList) {
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
                                     jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
78
                                     jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
81
                                     jobInfo.setTriggerNextTime(
79
                                     jobInfo.setTriggerNextTime(
83
                                                     .getNextValidTimeAfter(new Date())
81
                                                     .getNextValidTimeAfter(new Date())
84
                                                     .getTime()
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
                                     jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
91
                                     jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
90
                                     jobInfo.setTriggerNextTime(
92
                                     jobInfo.setTriggerNextTime(
92
                                                     .getNextValidTimeAfter(new Date())
94
                                                     .getNextValidTimeAfter(new Date())
93
                                                     .getTime()
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
                                     jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
107
                                     jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
99
                                     jobInfo.setTriggerNextTime(
108
                                     jobInfo.setTriggerNextTime(
101
                                                     .getNextValidTimeAfter(new Date(jobInfo.getTriggerNextTime()))
110
                                                     .getNextValidTimeAfter(new Date(jobInfo.getTriggerNextTime()))
102
                                                     .getTime()
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
                             // 3、更新trigger信息
127
                             // 3、更新trigger信息
181
                     }
188
                     }
182
                 }
189
                 }
183
 
190
 
184
-                int lastSecond = -1;
185
                 while (!ringThreadToStop) {
191
                 while (!ringThreadToStop) {
186
 
192
 
187
                     try {
193
                     try {
188
                         // second data
194
                         // second data
189
                         List<Integer> ringItemData = new ArrayList<>();
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
                             if (tmpData != null) {
199
                             if (tmpData != null) {
199
                                 ringItemData.addAll(tmpData);
200
                                 ringItemData.addAll(tmpData);
200
                             }
201
                             }
201
-
202
-                            if (secondItem == nowSecond) {
203
-                                break;
204
-                            }
205
                         }
202
                         }
206
-                        lastSecond = nowSecond;
207
 
203
 
208
                         // ring trigger
204
                         // ring trigger
209
                         logger.debug(">>>>>>>>>>> xxl-job, time-ring beat : " + nowSecond + " = " + Arrays.asList(ringItemData) );
205
                         logger.debug(">>>>>>>>>>> xxl-job, time-ring beat : " + nowSecond + " = " + Arrays.asList(ringItemData) );