Parcourir la source

框架底层守护线程异常处理逻辑优化,避免极端情况下因Error导致调度终止、丢失问题。

xuxueli il y a 11 mois
Parent
commit
267c1dd956

+ 5 - 4
doc/XXL-JOB官方文档.md

@@ -2401,10 +2401,11 @@ public void execute() {
 
 
 ### 7.36 版本 v2.5.0 Release Notes[规划中]
-- 1、【优化】部分系统日志优化,提升可读性;
-- 2、[规划中]升级springboot3.x,解决2.x老版本漏洞类问题。注意,springboot3.x依赖jdk17。
-- 3、[规划中]安全功能增强,通讯加密参数改用加密数据避免AccessToken明文, 降低token泄漏风险。
-- 4、[规划中]登陆态Token声称逻辑优化,混淆登陆时间属性,降低token泄漏风险。
+- 1、【优化】框架底层守护线程异常处理逻辑优化,避免极端情况下因Error导致调度终止、丢失问题。
+- 2、【优化】部分系统日志优化,提升可读性;
+- 3、[规划中]升级springboot3.x,解决2.x老版本漏洞类问题。注意,springboot3.x依赖jdk17。
+- 4、[规划中]安全功能增强,通讯加密参数改用加密数据避免AccessToken明文, 降低token泄漏风险。
+- 5、[规划中]登陆态Token声称逻辑优化,混淆登陆时间属性,降低token泄漏风险。
 
 ### TODO LIST
 - 1、调度隔离:调度中心针对不同执行器,各自维护不同的调度和远程触发组件。

+ 4 - 4
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java

@@ -65,7 +65,7 @@ public class JobCompleteHelper {
 				// wait for JobTriggerPoolHelper-init
 				try {
 					TimeUnit.MILLISECONDS.sleep(50);
-				} catch (InterruptedException e) {
+				} catch (Throwable e) {
 					if (!toStop) {
 						logger.error(e.getMessage(), e);
 					}
@@ -92,7 +92,7 @@ public class JobCompleteHelper {
 							}
 
 						}
-					} catch (Exception e) {
+					} catch (Throwable e) {
 						if (!toStop) {
 							logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e);
 						}
@@ -100,7 +100,7 @@ public class JobCompleteHelper {
 
                     try {
                         TimeUnit.SECONDS.sleep(60);
-                    } catch (Exception e) {
+                    } catch (Throwable e) {
                         if (!toStop) {
                             logger.error(e.getMessage(), e);
                         }
@@ -127,7 +127,7 @@ public class JobCompleteHelper {
 		monitorThread.interrupt();
 		try {
 			monitorThread.join();
-		} catch (InterruptedException e) {
+		} catch (Throwable e) {
 			logger.error(e.getMessage(), e);
 		}
 	}

+ 3 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java

@@ -71,7 +71,7 @@ public class JobFailMonitorHelper {
 							}
 						}
 
-					} catch (Exception e) {
+					} catch (Throwable e) {
 						if (!toStop) {
 							logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e);
 						}
@@ -79,7 +79,7 @@ public class JobFailMonitorHelper {
 
                     try {
                         TimeUnit.SECONDS.sleep(10);
-                    } catch (Exception e) {
+                    } catch (Throwable e) {
                         if (!toStop) {
                             logger.error(e.getMessage(), e);
                         }
@@ -102,7 +102,7 @@ public class JobFailMonitorHelper {
 		monitorThread.interrupt();
 		try {
 			monitorThread.join();
-		} catch (InterruptedException e) {
+		} catch (Throwable e) {
 			logger.error(e.getMessage(), e);
 		}
 	}

+ 3 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java

@@ -87,7 +87,7 @@ public class JobLogReportHelper {
                             }
                         }
 
-                    } catch (Exception e) {
+                    } catch (Throwable e) {
                         if (!toStop) {
                             logger.error(">>>>>>>>>>> xxl-job, job log report thread error:{}", e);
                         }
@@ -121,7 +121,7 @@ public class JobLogReportHelper {
 
                     try {
                         TimeUnit.MINUTES.sleep(1);
-                    } catch (Exception e) {
+                    } catch (Throwable e) {
                         if (!toStop) {
                             logger.error(e.getMessage(), e);
                         }
@@ -144,7 +144,7 @@ public class JobLogReportHelper {
         logrThread.interrupt();
         try {
             logrThread.join();
-        } catch (InterruptedException e) {
+        } catch (Throwable e) {
             logger.error(e.getMessage(), e);
         }
     }

+ 3 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java

@@ -107,14 +107,14 @@ public class JobRegistryHelper {
 								XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group);
 							}
 						}
-					} catch (Exception e) {
+					} catch (Throwable e) {
 						if (!toStop) {
 							logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e);
 						}
 					}
 					try {
 						TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);
-					} catch (InterruptedException e) {
+					} catch (Throwable e) {
 						if (!toStop) {
 							logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e);
 						}
@@ -138,7 +138,7 @@ public class JobRegistryHelper {
 		registryMonitorThread.interrupt();
 		try {
 			registryMonitorThread.join();
-		} catch (InterruptedException e) {
+		} catch (Throwable e) {
 			logger.error(e.getMessage(), e);
 		}
 	}

+ 16 - 17
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java

@@ -11,7 +11,6 @@ import org.slf4j.LoggerFactory;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
-import java.sql.SQLException;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
@@ -44,7 +43,7 @@ public class JobScheduleHelper {
 
                 try {
                     TimeUnit.MILLISECONDS.sleep(5000 - System.currentTimeMillis()%1000 );
-                } catch (InterruptedException e) {
+                } catch (Throwable e) {
                     if (!scheduleThreadToStop) {
                         logger.error(e.getMessage(), e);
                     }
@@ -150,7 +149,7 @@ public class JobScheduleHelper {
                         // tx stop
 
 
-                    } catch (Exception e) {
+                    } catch (Throwable e) {
                         if (!scheduleThreadToStop) {
                             logger.error(">>>>>>>>>>> xxl-job, JobScheduleHelper#scheduleThread error:{}", e);
                         }
@@ -160,21 +159,21 @@ public class JobScheduleHelper {
                         if (conn != null) {
                             try {
                                 conn.commit();
-                            } catch (SQLException e) {
+                            } catch (Throwable e) {
                                 if (!scheduleThreadToStop) {
                                     logger.error(e.getMessage(), e);
                                 }
                             }
                             try {
                                 conn.setAutoCommit(connAutoCommit);
-                            } catch (SQLException e) {
+                            } catch (Throwable e) {
                                 if (!scheduleThreadToStop) {
                                     logger.error(e.getMessage(), e);
                                 }
                             }
                             try {
                                 conn.close();
-                            } catch (SQLException e) {
+                            } catch (Throwable e) {
                                 if (!scheduleThreadToStop) {
                                     logger.error(e.getMessage(), e);
                                 }
@@ -185,7 +184,7 @@ public class JobScheduleHelper {
                         if (null != preparedStatement) {
                             try {
                                 preparedStatement.close();
-                            } catch (SQLException e) {
+                            } catch (Throwable e) {
                                 if (!scheduleThreadToStop) {
                                     logger.error(e.getMessage(), e);
                                 }
@@ -200,7 +199,7 @@ public class JobScheduleHelper {
                         try {
                             // pre-read period: success > scan each second; fail > skip this period;
                             TimeUnit.MILLISECONDS.sleep((preReadSuc?1000:PRE_READ_MS) - System.currentTimeMillis()%1000);
-                        } catch (InterruptedException e) {
+                        } catch (Throwable e) {
                             if (!scheduleThreadToStop) {
                                 logger.error(e.getMessage(), e);
                             }
@@ -227,7 +226,7 @@ public class JobScheduleHelper {
                     // align second
                     try {
                         TimeUnit.MILLISECONDS.sleep(1000 - System.currentTimeMillis() % 1000);
-                    } catch (InterruptedException e) {
+                    } catch (Throwable e) {
                         if (!ringThreadToStop) {
                             logger.error(e.getMessage(), e);
                         }
@@ -255,7 +254,7 @@ public class JobScheduleHelper {
                             // clear
                             ringItemData.clear();
                         }
-                    } catch (Exception e) {
+                    } catch (Throwable e) {
                         if (!ringThreadToStop) {
                             logger.error(">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread error:{}", e);
                         }
@@ -269,7 +268,7 @@ public class JobScheduleHelper {
         ringThread.start();
     }
 
-    private void refreshNextValidTime(XxlJobInfo jobInfo, Date fromTime) throws Exception {
+    private void refreshNextValidTime(XxlJobInfo jobInfo, Date fromTime) {
         try {
             Date nextValidTime = generateNextValidTime(jobInfo, fromTime);
             if (nextValidTime != null) {
@@ -283,7 +282,7 @@ public class JobScheduleHelper {
                 logger.error(">>>>>>>>>>> xxl-job, refreshNextValidTime fail for job: jobId={}, scheduleType={}, scheduleConf={}",
                         jobInfo.getId(), jobInfo.getScheduleType(), jobInfo.getScheduleConf());
             }
-        } catch (Exception e) {
+        } catch (Throwable e) {
             // generateNextValidTime error, stop job
             jobInfo.setTriggerStatus(0);
             jobInfo.setTriggerLastTime(0);
@@ -312,7 +311,7 @@ public class JobScheduleHelper {
         scheduleThreadToStop = true;
         try {
             TimeUnit.SECONDS.sleep(1);  // wait
-        } catch (InterruptedException e) {
+        } catch (Throwable e) {
             logger.error(e.getMessage(), e);
         }
         if (scheduleThread.getState() != Thread.State.TERMINATED){
@@ -320,7 +319,7 @@ public class JobScheduleHelper {
             scheduleThread.interrupt();
             try {
                 scheduleThread.join();
-            } catch (InterruptedException e) {
+            } catch (Throwable e) {
                 logger.error(e.getMessage(), e);
             }
         }
@@ -339,7 +338,7 @@ public class JobScheduleHelper {
         if (hasRingData) {
             try {
                 TimeUnit.SECONDS.sleep(8);
-            } catch (InterruptedException e) {
+            } catch (Throwable e) {
                 logger.error(e.getMessage(), e);
             }
         }
@@ -348,7 +347,7 @@ public class JobScheduleHelper {
         ringThreadToStop = true;
         try {
             TimeUnit.SECONDS.sleep(1);
-        } catch (InterruptedException e) {
+        } catch (Throwable e) {
             logger.error(e.getMessage(), e);
         }
         if (ringThread.getState() != Thread.State.TERMINATED){
@@ -356,7 +355,7 @@ public class JobScheduleHelper {
             ringThread.interrupt();
             try {
                 ringThread.join();
-            } catch (InterruptedException e) {
+            } catch (Throwable e) {
                 logger.error(e.getMessage(), e);
             }
         }

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java

@@ -93,7 +93,7 @@ public class JobTriggerPoolHelper {
                 try {
                     // do trigger
                     XxlJobTrigger.trigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList);
-                } catch (Exception e) {
+                } catch (Throwable e) {
                     logger.error(e.getMessage(), e);
                 } finally {
 

+ 3 - 3
xxl-job-core/src/main/java/com/xxl/job/core/server/EmbedServer.java

@@ -89,14 +89,14 @@ public class EmbedServer {
 
                 } catch (InterruptedException e) {
                     logger.info(">>>>>>>>>>> xxl-job remoting server stop.");
-                } catch (Exception e) {
+                } catch (Throwable e) {
                     logger.error(">>>>>>>>>>> xxl-job remoting server error.", e);
                 } finally {
                     // stop
                     try {
                         workerGroup.shutdownGracefully();
                         bossGroup.shutdownGracefully();
-                    } catch (Exception e) {
+                    } catch (Throwable e) {
                         logger.error(e.getMessage(), e);
                     }
                 }
@@ -200,7 +200,7 @@ public class EmbedServer {
                     default:
                         return new ReturnT<String>(ReturnT.FAIL_CODE, "invalid request, uri-mapping(" + uri + ") not found.");
                 }
-            } catch (Exception e) {
+            } catch (Throwable e) {
                 logger.error(e.getMessage(), e);
                 return new ReturnT<String>(ReturnT.FAIL_CODE, "request error:" + ThrowableUtil.toString(e));
             }

+ 6 - 6
xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java

@@ -53,12 +53,12 @@ public class ExecutorRegistryThread {
                                 } else {
                                     logger.info(">>>>>>>>>>> xxl-job registry fail, registryParam:{}, registryResult:{}", new Object[]{registryParam, registryResult});
                                 }
-                            } catch (Exception e) {
+                            } catch (Throwable e) {
                                 logger.info(">>>>>>>>>>> xxl-job registry error, registryParam:{}", registryParam, e);
                             }
 
                         }
-                    } catch (Exception e) {
+                    } catch (Throwable e) {
                         if (!toStop) {
                             logger.error(e.getMessage(), e);
                         }
@@ -69,7 +69,7 @@ public class ExecutorRegistryThread {
                         if (!toStop) {
                             TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);
                         }
-                    } catch (InterruptedException e) {
+                    } catch (Throwable e) {
                         if (!toStop) {
                             logger.warn(">>>>>>>>>>> xxl-job, executor registry thread interrupted, error msg:{}", e.getMessage());
                         }
@@ -89,7 +89,7 @@ public class ExecutorRegistryThread {
                             } else {
                                 logger.info(">>>>>>>>>>> xxl-job registry-remove fail, registryParam:{}, registryResult:{}", new Object[]{registryParam, registryResult});
                             }
-                        } catch (Exception e) {
+                        } catch (Throwable e) {
                             if (!toStop) {
                                 logger.info(">>>>>>>>>>> xxl-job registry-remove error, registryParam:{}", registryParam, e);
                             }
@@ -97,7 +97,7 @@ public class ExecutorRegistryThread {
                         }
 
                     }
-                } catch (Exception e) {
+                } catch (Throwable e) {
                     if (!toStop) {
                         logger.error(e.getMessage(), e);
                     }
@@ -119,7 +119,7 @@ public class ExecutorRegistryThread {
             registryThread.interrupt();
             try {
                 registryThread.join();
-            } catch (InterruptedException e) {
+            } catch (Throwable e) {
                 logger.error(e.getMessage(), e);
             }
         }

+ 2 - 2
xxl-job-core/src/main/java/com/xxl/job/core/thread/JobLogFileCleanThread.java

@@ -81,7 +81,7 @@ public class JobLogFileCleanThread {
                             }
                         }
 
-                    } catch (Exception e) {
+                    } catch (Throwable e) {
                         if (!toStop) {
                             logger.error(e.getMessage(), e);
                         }
@@ -90,7 +90,7 @@ public class JobLogFileCleanThread {
 
                     try {
                         TimeUnit.DAYS.sleep(1);
-                    } catch (InterruptedException e) {
+                    } catch (Throwable e) {
                         if (!toStop) {
                             logger.error(e.getMessage(), e);
                         }

+ 7 - 7
xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java

@@ -76,7 +76,7 @@ public class TriggerCallbackThread {
                                 doCallback(callbackParamList);
                             }
                         }
-                    } catch (Exception e) {
+                    } catch (Throwable e) {
                         if (!toStop) {
                             logger.error(e.getMessage(), e);
                         }
@@ -90,7 +90,7 @@ public class TriggerCallbackThread {
                     if (callbackParamList!=null && callbackParamList.size()>0) {
                         doCallback(callbackParamList);
                     }
-                } catch (Exception e) {
+                } catch (Throwable e) {
                     if (!toStop) {
                         logger.error(e.getMessage(), e);
                     }
@@ -111,7 +111,7 @@ public class TriggerCallbackThread {
                 while(!toStop){
                     try {
                         retryFailCallbackFile();
-                    } catch (Exception e) {
+                    } catch (Throwable e) {
                         if (!toStop) {
                             logger.error(e.getMessage(), e);
                         }
@@ -119,7 +119,7 @@ public class TriggerCallbackThread {
                     }
                     try {
                         TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);
-                    } catch (InterruptedException e) {
+                    } catch (Throwable e) {
                         if (!toStop) {
                             logger.error(e.getMessage(), e);
                         }
@@ -139,7 +139,7 @@ public class TriggerCallbackThread {
             triggerCallbackThread.interrupt();
             try {
                 triggerCallbackThread.join();
-            } catch (InterruptedException e) {
+            } catch (Throwable e) {
                 logger.error(e.getMessage(), e);
             }
         }
@@ -149,7 +149,7 @@ public class TriggerCallbackThread {
             triggerRetryCallbackThread.interrupt();
             try {
                 triggerRetryCallbackThread.join();
-            } catch (InterruptedException e) {
+            } catch (Throwable e) {
                 logger.error(e.getMessage(), e);
             }
         }
@@ -173,7 +173,7 @@ public class TriggerCallbackThread {
                 } else {
                     callbackLog(callbackParamList, "<br>----------- xxl-job job callback fail, callbackResult:" + callbackResult);
                 }
-            } catch (Exception e) {
+            } catch (Throwable e) {
                 callbackLog(callbackParamList, "<br>----------- xxl-job job callback error, errorMsg:" + e.getMessage());
             }
         }