ソースを参照

执行器回调日志落盘方案复用RPC序列化方案,并移除Jackson依赖;

xuxueli 6 年 前
コミット
46779d7e6b

+ 2 - 1
doc/XXL-JOB官方文档.md ファイルの表示

@@ -1419,9 +1419,10 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
1419 1419
 - 5、精简项目,取消第三方依赖,如 commons-collections4 ;
1420 1420
 - 6、底层Log调优,应用正常终止取消异常栈信息打印;
1421 1421
 - 7、交互优化,尽量避免新开页面窗口;仅WebIDE支持新开页,并提供窗口快速关闭按钮;
1422
-- 8、[测试中]底层通讯方案优化:升级较新版本xxl-rpc,由"JETTY"方案调整为"NETTY_HTTP"方案,执行器内嵌netty-http-server提供服务,调度中心复用容器端口提供服务;
1422
+- 8、底层通讯方案优化:升级较新版本xxl-rpc,由"JETTY"方案调整为"NETTY_HTTP"方案,执行器内嵌netty-http-server提供服务,调度中心复用容器端口提供服务;
1423 1423
 - 9、任务暂停、删除优化,避免quartz delete不完整导致任务脏数据;
1424 1424
 - 10、任务回调、心跳注册成功日志优化,非核心常规日志调整为debug级别,降低冗余日志输出;
1425
+- 11、执行器回调日志落盘方案复用RPC序列化方案,并移除Jackson依赖;
1425 1426
 - [迭代中]注册中心优化,实时性注册发现:心跳注册间隔10s,refresh失败则首次注册并立即更新注册信息,心跳类似;30s过期销毁;
1426 1427
 - [迭代中]脚本任务,支持数据参数,新版本仅支持单参数不支持需要兼容;
1427 1428
 - [迭代中]提供执行器Docker镜像;

+ 0 - 2
pom.xml ファイルの表示

@@ -41,8 +41,6 @@
41 41
 		<groovy.version>2.5.5</groovy.version>
42 42
 		<quartz.version>2.3.0</quartz.version>
43 43
 
44
-		<jackson.version>2.9.8</jackson.version>
45
-
46 44
 	</properties>
47 45
 
48 46
 	<build>

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java ファイルの表示

@@ -1,7 +1,7 @@
1 1
 package com.xxl.job.admin.controller.resolver;
2 2
 
3 3
 import com.xxl.job.core.biz.model.ReturnT;
4
-import com.xxl.job.core.util.JacksonUtil;
4
+import com.xxl.job.admin.core.util.JacksonUtil;
5 5
 import org.slf4j.Logger;
6 6
 import org.slf4j.LoggerFactory;
7 7
 import org.springframework.stereotype.Component;

+ 0 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java ファイルの表示

@@ -1,7 +1,6 @@
1 1
 package com.xxl.job.admin.core.util;
2 2
 
3 3
 import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
4
-import com.xxl.job.core.util.JacksonUtil;
5 4
 import org.apache.commons.lang3.StringUtils;
6 5
 import org.slf4j.Logger;
7 6
 import org.slf4j.LoggerFactory;

xxl-job-core/src/main/java/com/xxl/job/core/util/JacksonUtil.java → xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java ファイルの表示

@@ -1,4 +1,4 @@
1
-package com.xxl.job.core.util;
1
+package com.xxl.job.admin.core.util;
2 2
 
3 3
 import com.fasterxml.jackson.core.JsonGenerationException;
4 4
 import com.fasterxml.jackson.core.JsonParseException;

+ 0 - 7
xxl-job-core/pom.xml ファイルの表示

@@ -36,13 +36,6 @@
36 36
 			<version>${commons-exec.version}</version>
37 37
 		</dependency>
38 38
 
39
-		<!-- jackson -->
40
-		<dependency>
41
-			<groupId>com.fasterxml.jackson.core</groupId>
42
-			<artifactId>jackson-databind</artifactId>
43
-			<version>${jackson.version}</version>
44
-		</dependency>
45
-
46 39
 		<!-- spring-context -->
47 40
 		<dependency>
48 41
 			<groupId>org.springframework</groupId>

+ 6 - 1
xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java ファイルの表示

@@ -107,7 +107,9 @@ public class XxlJobExecutor  {
107 107
 
108 108
     // ---------------------- admin-client (rpc invoker) ----------------------
109 109
     private static List<AdminBiz> adminBizList;
110
+    private static Serializer serializer;
110 111
     private void initAdminBizList(String adminAddresses, String accessToken) throws Exception {
112
+        serializer = Serializer.SerializeEnum.HESSIAN.getSerializer();
111 113
         if (adminAddresses!=null && adminAddresses.trim().length()>0) {
112 114
             for (String address: adminAddresses.trim().split(",")) {
113 115
                 if (address!=null && address.trim().length()>0) {
@@ -116,7 +118,7 @@ public class XxlJobExecutor  {
116 118
 
117 119
                     AdminBiz adminBiz = (AdminBiz) new XxlRpcReferenceBean(
118 120
                             NetEnum.NETTY_HTTP,
119
-                            Serializer.SerializeEnum.HESSIAN.getSerializer(),
121
+                            serializer,
120 122
                             CallType.SYNC,
121 123
                             LoadBalance.ROUND,
122 124
                             AdminBiz.class,
@@ -139,6 +141,9 @@ public class XxlJobExecutor  {
139 141
     public static List<AdminBiz> getAdminBizList(){
140 142
         return adminBizList;
141 143
     }
144
+    public static Serializer getSerializer() {
145
+        return serializer;
146
+    }
142 147
 
143 148
 
144 149
     // ---------------------- executor-server (rpc provider) ----------------------

+ 37 - 31
xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java ファイルの表示

@@ -8,7 +8,6 @@ import com.xxl.job.core.executor.XxlJobExecutor;
8 8
 import com.xxl.job.core.log.XxlJobFileAppender;
9 9
 import com.xxl.job.core.log.XxlJobLogger;
10 10
 import com.xxl.job.core.util.FileUtil;
11
-import com.xxl.job.core.util.JacksonUtil;
12 11
 import org.slf4j.Logger;
13 12
 import org.slf4j.LoggerFactory;
14 13
 
@@ -190,46 +189,53 @@ public class TriggerCallbackThread {
190 189
 
191 190
     // ---------------------- fail-callback file ----------------------
192 191
 
193
-    private static String failCallbackFileName = XxlJobFileAppender.getLogPath().concat(File.separator).concat("xxl-job-callback").concat(".log");
192
+    private static String failCallbackFilePath = XxlJobFileAppender.getLogPath().concat(File.separator);
193
+    private static String failCallbackFileName = failCallbackFilePath.concat("xxl-job-callback-{x}").concat(".log");
194 194
 
195 195
     private void appendFailCallbackFile(List<HandleCallbackParam> callbackParamList){
196
+        // valid
197
+        if (callbackParamList==null || callbackParamList.size()==0) {
198
+            return;
199
+        }
200
+
196 201
         // append file
197
-        String content = JacksonUtil.writeValueAsString(callbackParamList);
198
-        FileUtil.appendFileLine(failCallbackFileName, content);
202
+        byte[] callbackParamList_bytes = XxlJobExecutor.getSerializer().serialize(callbackParamList);
203
+
204
+        File callbackLogFile = new File(failCallbackFileName.replace("{x}", String.valueOf(System.currentTimeMillis())));
205
+        if (callbackLogFile.exists()) {
206
+            for (int i = 0; i < 100; i++) {
207
+                callbackLogFile = new File(failCallbackFileName.replace("{x}", String.valueOf(System.currentTimeMillis()).concat("-").concat(String.valueOf(i)) ));
208
+                if (!callbackLogFile.exists()) {
209
+                    break;
210
+                }
211
+            }
212
+        }
213
+        FileUtil.writeFileContent(callbackLogFile, callbackParamList_bytes);
199 214
     }
200 215
 
201 216
     private void retryFailCallbackFile(){
202 217
 
203
-        // load and clear file
204
-        List<String> fileLines = FileUtil.loadFileLines(failCallbackFileName);
205
-        FileUtil.deleteFile(failCallbackFileName);
206
-
207
-        // parse
208
-        List<HandleCallbackParam> failCallbackParamList = new ArrayList<>();
209
-        if (fileLines!=null && fileLines.size()>0) {
210
-            for (String line: fileLines) {
211
-                List<HandleCallbackParam> failCallbackParamListTmp = JacksonUtil.readValue(line, List.class, HandleCallbackParam.class);
212
-                if (failCallbackParamListTmp!=null && failCallbackParamListTmp.size()>0) {
213
-                    failCallbackParamList.addAll(failCallbackParamListTmp);
214
-                }
215
-            }
218
+        // valid
219
+        File callbackLogPath = new File(failCallbackFilePath);
220
+        if (!callbackLogPath.exists()) {
221
+            return;
222
+        }
223
+        if (callbackLogPath.isFile()) {
224
+            callbackLogPath.delete();
225
+        }
226
+        if (!(callbackLogPath.isDirectory() && callbackLogPath.list()!=null && callbackLogPath.list().length>0)) {
227
+            return;
216 228
         }
217 229
 
218
-        // retry callback, 100 lines per page
219
-        if (failCallbackParamList!=null && failCallbackParamList.size()>0) {
220
-            int pagesize = 100;
221
-            List<HandleCallbackParam> pageData = new ArrayList<>();
222
-            for (int i = 0; i < failCallbackParamList.size(); i++) {
223
-                pageData.add(failCallbackParamList.get(i));
224
-                if (i>0 && i%pagesize == 0) {
225
-                    doCallback(pageData);
226
-                    pageData.clear();
227
-                }
228
-            }
229
-            if (pageData.size() > 0) {
230
-                doCallback(pageData);
231
-            }
230
+        // load and clear file, retry
231
+        for (File callbaclLogFile: callbackLogPath.listFiles()) {
232
+            byte[] callbackParamList_bytes = FileUtil.readFileContent(callbaclLogFile);
233
+            List<HandleCallbackParam> callbackParamList = (List<HandleCallbackParam>) XxlJobExecutor.getSerializer().deserialize(callbackParamList_bytes, HandleCallbackParam.class);
234
+
235
+            callbaclLogFile.delete();
236
+            doCallback(callbackParamList);
232 237
         }
238
+
233 239
     }
234 240
 
235 241
 }

+ 65 - 5
xxl-job-core/src/main/java/com/xxl/job/core/util/FileUtil.java ファイルの表示

@@ -3,9 +3,10 @@ package com.xxl.job.core.util;
3 3
 import org.slf4j.Logger;
4 4
 import org.slf4j.LoggerFactory;
5 5
 
6
-import java.io.*;
7
-import java.util.ArrayList;
8
-import java.util.List;
6
+import java.io.File;
7
+import java.io.FileInputStream;
8
+import java.io.FileOutputStream;
9
+import java.io.IOException;
9 10
 
10 11
 /**
11 12
  * file tool
@@ -15,6 +16,7 @@ import java.util.List;
15 16
 public class FileUtil {
16 17
     private static Logger logger = LoggerFactory.getLogger(FileUtil.class);
17 18
 
19
+
18 20
     /**
19 21
      * delete recursively
20 22
      *
@@ -36,6 +38,7 @@ public class FileUtil {
36 38
         return false;
37 39
     }
38 40
 
41
+
39 42
     public static void deleteFile(String fileName) {
40 43
         // file
41 44
         File file = new File(fileName);
@@ -44,7 +47,64 @@ public class FileUtil {
44 47
         }
45 48
     }
46 49
 
47
-    public static void appendFileLine(String fileName, String content) {
50
+
51
+    public static void writeFileContent(File file, byte[] data) {
52
+
53
+        // file
54
+        if (!file.exists()) {
55
+            try {
56
+                file.createNewFile();
57
+            } catch (IOException e) {
58
+                logger.error(e.getMessage(), e);
59
+                return;
60
+            }
61
+        }
62
+
63
+        // append file content
64
+        FileOutputStream fos = null;
65
+        try {
66
+            fos = new FileOutputStream(file);
67
+            fos.write(data);
68
+            fos.flush();
69
+        } catch (Exception e) {
70
+            logger.error(e.getMessage(), e);
71
+        } finally {
72
+            if (fos != null) {
73
+                try {
74
+                    fos.close();
75
+                } catch (IOException e) {
76
+                    logger.error(e.getMessage(), e);
77
+                }
78
+            }
79
+        }
80
+
81
+    }
82
+
83
+    public static byte[] readFileContent(File file) {
84
+        Long filelength = file.length();
85
+        byte[] filecontent = new byte[filelength.intValue()];
86
+
87
+        FileInputStream in = null;
88
+        try {
89
+            in = new FileInputStream(file);
90
+            in.read(filecontent);
91
+            in.close();
92
+        } catch (Exception e) {
93
+            logger.error(e.getMessage(), e);
94
+        } finally {
95
+            if (in != null) {
96
+                try {
97
+                    in.close();
98
+                } catch (IOException e) {
99
+                    logger.error(e.getMessage(), e);
100
+                }
101
+            }
102
+        }
103
+        return filecontent;
104
+    }
105
+
106
+
107
+    /*public static void appendFileLine(String fileName, String content) {
48 108
 
49 109
         // file
50 110
         File file = new File(fileName);
@@ -119,6 +179,6 @@ public class FileUtil {
119 179
         }
120 180
 
121 181
         return result;
122
-    }
182
+    }*/
123 183
 
124 184
 }