|
|
@@ -3,16 +3,21 @@ package com.xxl.job.core.thread;
|
|
3
|
3
|
import com.xxl.job.core.biz.AdminBiz;
|
|
4
|
4
|
import com.xxl.job.core.biz.model.HandleCallbackParam;
|
|
5
|
5
|
import com.xxl.job.core.biz.model.ReturnT;
|
|
|
6
|
+import com.xxl.job.core.enums.RegistryConfig;
|
|
6
|
7
|
import com.xxl.job.core.executor.XxlJobExecutor;
|
|
7
|
8
|
import com.xxl.job.core.log.XxlJobFileAppender;
|
|
8
|
9
|
import com.xxl.job.core.log.XxlJobLogger;
|
|
|
10
|
+import com.xxl.job.core.util.FileUtil;
|
|
|
11
|
+import com.xxl.job.core.util.JacksonUtil;
|
|
9
|
12
|
import org.slf4j.Logger;
|
|
10
|
13
|
import org.slf4j.LoggerFactory;
|
|
11
|
14
|
|
|
|
15
|
+import java.io.File;
|
|
12
|
16
|
import java.util.ArrayList;
|
|
13
|
17
|
import java.util.Date;
|
|
14
|
18
|
import java.util.List;
|
|
15
|
19
|
import java.util.concurrent.LinkedBlockingQueue;
|
|
|
20
|
+import java.util.concurrent.TimeUnit;
|
|
16
|
21
|
|
|
17
|
22
|
/**
|
|
18
|
23
|
* Created by xuxueli on 16/7/22.
|
|
|
@@ -38,6 +43,7 @@ public class TriggerCallbackThread {
|
|
38
|
43
|
* callback thread
|
|
39
|
44
|
*/
|
|
40
|
45
|
private Thread triggerCallbackThread;
|
|
|
46
|
+ private Thread triggerRetryCallbackThread;
|
|
41
|
47
|
private volatile boolean toStop = false;
|
|
42
|
48
|
public void start() {
|
|
43
|
49
|
|
|
|
@@ -47,6 +53,7 @@ public class TriggerCallbackThread {
|
|
47
|
53
|
return;
|
|
48
|
54
|
}
|
|
49
|
55
|
|
|
|
56
|
+ // callback
|
|
50
|
57
|
triggerCallbackThread = new Thread(new Runnable() {
|
|
51
|
58
|
|
|
52
|
59
|
@Override
|
|
|
@@ -89,16 +96,48 @@ public class TriggerCallbackThread {
|
|
89
|
96
|
});
|
|
90
|
97
|
triggerCallbackThread.setDaemon(true);
|
|
91
|
98
|
triggerCallbackThread.start();
|
|
|
99
|
+
|
|
|
100
|
+
|
|
|
101
|
+ // retry
|
|
|
102
|
+ triggerRetryCallbackThread = new Thread(new Runnable() {
|
|
|
103
|
+ @Override
|
|
|
104
|
+ public void run() {
|
|
|
105
|
+ while(!toStop){
|
|
|
106
|
+ try {
|
|
|
107
|
+ retryFailCallbackFile();
|
|
|
108
|
+ } catch (Exception e) {
|
|
|
109
|
+ logger.error(e.getMessage(), e);
|
|
|
110
|
+ }
|
|
|
111
|
+ try {
|
|
|
112
|
+ TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);
|
|
|
113
|
+ } catch (InterruptedException e) {
|
|
|
114
|
+ logger.error(e.getMessage(), e);
|
|
|
115
|
+ }
|
|
|
116
|
+ }
|
|
|
117
|
+ logger.info(">>>>>>>>>>> xxl-job, executor retry callback thread destory.");
|
|
|
118
|
+ }
|
|
|
119
|
+ });
|
|
|
120
|
+ triggerRetryCallbackThread.setDaemon(true);
|
|
|
121
|
+ triggerRetryCallbackThread.start();
|
|
|
122
|
+
|
|
92
|
123
|
}
|
|
93
|
124
|
public void toStop(){
|
|
94
|
125
|
toStop = true;
|
|
95
|
|
- // interrupt and wait
|
|
|
126
|
+ // stop callback, interrupt and wait
|
|
96
|
127
|
triggerCallbackThread.interrupt();
|
|
97
|
128
|
try {
|
|
98
|
129
|
triggerCallbackThread.join();
|
|
99
|
130
|
} catch (InterruptedException e) {
|
|
100
|
131
|
logger.error(e.getMessage(), e);
|
|
101
|
132
|
}
|
|
|
133
|
+
|
|
|
134
|
+ // stop retry, interrupt and wait
|
|
|
135
|
+ triggerRetryCallbackThread.interrupt();
|
|
|
136
|
+ try {
|
|
|
137
|
+ triggerRetryCallbackThread.join();
|
|
|
138
|
+ } catch (InterruptedException e) {
|
|
|
139
|
+ logger.error(e.getMessage(), e);
|
|
|
140
|
+ }
|
|
102
|
141
|
}
|
|
103
|
142
|
|
|
104
|
143
|
/**
|
|
|
@@ -106,21 +145,25 @@ public class TriggerCallbackThread {
|
|
106
|
145
|
* @param callbackParamList
|
|
107
|
146
|
*/
|
|
108
|
147
|
private void doCallback(List<HandleCallbackParam> callbackParamList){
|
|
|
148
|
+ boolean callbackRet = false;
|
|
109
|
149
|
// callback, will retry if error
|
|
110
|
150
|
for (AdminBiz adminBiz: XxlJobExecutor.getAdminBizList()) {
|
|
111
|
151
|
try {
|
|
112
|
152
|
ReturnT<String> callbackResult = adminBiz.callback(callbackParamList);
|
|
113
|
153
|
if (callbackResult!=null && ReturnT.SUCCESS_CODE == callbackResult.getCode()) {
|
|
114
|
154
|
callbackLog(callbackParamList, "<br>----------- xxl-job callback success");
|
|
|
155
|
+ callbackRet = true;
|
|
115
|
156
|
break;
|
|
116
|
157
|
} else {
|
|
117
|
158
|
callbackLog(callbackParamList, "<br>----------- xxl-job callback fail, callbackResult:" + callbackResult);
|
|
118
|
159
|
}
|
|
119
|
160
|
} catch (Exception e) {
|
|
120
|
161
|
callbackLog(callbackParamList, "<br>----------- xxl-job callback error, errorMsg:" + e.getMessage());
|
|
121
|
|
- //getInstance().callBackQueue.addAll(callbackParamList);
|
|
122
|
162
|
}
|
|
123
|
163
|
}
|
|
|
164
|
+ if (!callbackRet) {
|
|
|
165
|
+ appendFailCallbackFile(callbackParamList);
|
|
|
166
|
+ }
|
|
124
|
167
|
}
|
|
125
|
168
|
|
|
126
|
169
|
/**
|
|
|
@@ -134,4 +177,49 @@ public class TriggerCallbackThread {
|
|
134
|
177
|
}
|
|
135
|
178
|
}
|
|
136
|
179
|
|
|
|
180
|
+
|
|
|
181
|
+ // ---------------------- fial-callback file TODO ----------------------
|
|
|
182
|
+
|
|
|
183
|
+ private static String failCallbackFileName = XxlJobFileAppender.getLogPath().concat(File.separator).concat("xxl-job-callback").concat(".log");
|
|
|
184
|
+
|
|
|
185
|
+ private void appendFailCallbackFile(List<HandleCallbackParam> callbackParamList){
|
|
|
186
|
+ // append file
|
|
|
187
|
+ String content = JacksonUtil.writeValueAsString(callbackParamList);
|
|
|
188
|
+ FileUtil.appendFileLine(failCallbackFileName, content);
|
|
|
189
|
+ }
|
|
|
190
|
+
|
|
|
191
|
+ private void retryFailCallbackFile(){
|
|
|
192
|
+
|
|
|
193
|
+ // load and clear file
|
|
|
194
|
+ List<String> fileLines = FileUtil.loadFileLines(failCallbackFileName);
|
|
|
195
|
+ FileUtil.deleteFile(failCallbackFileName);
|
|
|
196
|
+
|
|
|
197
|
+ // parse
|
|
|
198
|
+ List<HandleCallbackParam> failCallbackParamList = new ArrayList<>();
|
|
|
199
|
+ if (fileLines!=null && fileLines.size()>0) {
|
|
|
200
|
+ for (String line: fileLines) {
|
|
|
201
|
+ List<HandleCallbackParam> failCallbackParamListTmp = JacksonUtil.readValue(line, List.class, HandleCallbackParam.class);
|
|
|
202
|
+ if (failCallbackParamListTmp!=null && failCallbackParamListTmp.size()>0) {
|
|
|
203
|
+ failCallbackParamList.addAll(failCallbackParamListTmp);
|
|
|
204
|
+ }
|
|
|
205
|
+ }
|
|
|
206
|
+ }
|
|
|
207
|
+
|
|
|
208
|
+ // retry callback, 100 lines per page
|
|
|
209
|
+ if (failCallbackParamList!=null && failCallbackParamList.size()>0) {
|
|
|
210
|
+ int pagesize = 100;
|
|
|
211
|
+ List<HandleCallbackParam> pageData = new ArrayList<>();
|
|
|
212
|
+ for (int i = 0; i < failCallbackParamList.size(); i++) {
|
|
|
213
|
+ pageData.add(failCallbackParamList.get(i));
|
|
|
214
|
+ if (i>0 && i%pagesize == 0) {
|
|
|
215
|
+ doCallback(pageData);
|
|
|
216
|
+ pageData.clear();
|
|
|
217
|
+ }
|
|
|
218
|
+ }
|
|
|
219
|
+ if (pageData.size() > 0) {
|
|
|
220
|
+ doCallback(pageData);
|
|
|
221
|
+ }
|
|
|
222
|
+ }
|
|
|
223
|
+ }
|
|
|
224
|
+
|
|
137
|
225
|
}
|