| 
					
				 | 
			
			
				@@ -8,7 +8,6 @@ import com.xxl.job.core.executor.XxlJobExecutor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.xxl.job.core.log.XxlJobFileAppender; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.xxl.job.core.log.XxlJobLogger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.xxl.job.core.util.FileUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.xxl.job.core.util.JacksonUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.slf4j.Logger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.slf4j.LoggerFactory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -190,46 +189,53 @@ public class TriggerCallbackThread { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // ---------------------- fail-callback file ---------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private static String failCallbackFileName = XxlJobFileAppender.getLogPath().concat(File.separator).concat("xxl-job-callback").concat(".log"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static String failCallbackFilePath = XxlJobFileAppender.getLogPath().concat(File.separator); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static String failCallbackFileName = failCallbackFilePath.concat("xxl-job-callback-{x}").concat(".log"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private void appendFailCallbackFile(List<HandleCallbackParam> callbackParamList){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // valid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (callbackParamList==null || callbackParamList.size()==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // append file 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        String content = JacksonUtil.writeValueAsString(callbackParamList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        FileUtil.appendFileLine(failCallbackFileName, content); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        byte[] callbackParamList_bytes = XxlJobExecutor.getSerializer().serialize(callbackParamList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        File callbackLogFile = new File(failCallbackFileName.replace("{x}", String.valueOf(System.currentTimeMillis()))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (callbackLogFile.exists()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (int i = 0; i < 100; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callbackLogFile = new File(failCallbackFileName.replace("{x}", String.valueOf(System.currentTimeMillis()).concat("-").concat(String.valueOf(i)) )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!callbackLogFile.exists()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FileUtil.writeFileContent(callbackLogFile, callbackParamList_bytes); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private void retryFailCallbackFile(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // load and clear file 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        List<String> fileLines = FileUtil.loadFileLines(failCallbackFileName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        FileUtil.deleteFile(failCallbackFileName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // parse 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        List<HandleCallbackParam> failCallbackParamList = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (fileLines!=null && fileLines.size()>0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (String line: fileLines) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                List<HandleCallbackParam> failCallbackParamListTmp = JacksonUtil.readValue(line, List.class, HandleCallbackParam.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (failCallbackParamListTmp!=null && failCallbackParamListTmp.size()>0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    failCallbackParamList.addAll(failCallbackParamListTmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // valid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        File callbackLogPath = new File(failCallbackFilePath); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!callbackLogPath.exists()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (callbackLogPath.isFile()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            callbackLogPath.delete(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!(callbackLogPath.isDirectory() && callbackLogPath.list()!=null && callbackLogPath.list().length>0)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // retry callback, 100 lines per page 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (failCallbackParamList!=null && failCallbackParamList.size()>0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            int pagesize = 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            List<HandleCallbackParam> pageData = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (int i = 0; i < failCallbackParamList.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                pageData.add(failCallbackParamList.get(i)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (i>0 && i%pagesize == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    doCallback(pageData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    pageData.clear(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (pageData.size() > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                doCallback(pageData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // load and clear file, retry 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (File callbaclLogFile: callbackLogPath.listFiles()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            byte[] callbackParamList_bytes = FileUtil.readFileContent(callbaclLogFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<HandleCallbackParam> callbackParamList = (List<HandleCallbackParam>) XxlJobExecutor.getSerializer().deserialize(callbackParamList_bytes, HandleCallbackParam.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            callbaclLogFile.delete(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            doCallback(callbackParamList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |