Преглед на файлове

Merge pull request #219 from xhanthow/local-job

修改JobThread捕获Error错误不更新JobLog的问题
许雪里 преди 7 години
родител
ревизия
dd2de9d8f7
променени са 1 файла, в които са добавени 90 реда и са изтрити 82 реда
  1. 90 82
      xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java

+ 90 - 82
xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java

@@ -91,86 +91,94 @@ public class JobThread extends Thread{
 
 
     @Override
     @Override
 	public void run() {
 	public void run() {
-		while(!toStop){
-			running = false;
-			idleTimes++;
-			try {
-				// to check toStop signal, we need cycle, so wo cannot use queue.take(), instand of poll(timeout)
-				TriggerParam triggerParam = triggerQueue.poll(3L, TimeUnit.SECONDS);
-				if (triggerParam!=null) {
-					running = true;
-					idleTimes = 0;
-					triggerLogIdSet.remove(triggerParam.getLogId());
-					
-					// parse param
-					String[] handlerParams = (triggerParam.getExecutorParams()!=null && triggerParam.getExecutorParams().trim().length()>0)
-							? (String[])(Arrays.asList(triggerParam.getExecutorParams().split(",")).toArray()) : null;
-					
-					// handle job
-					ReturnT<String> executeResult = null;
-					try {
-						// log filename: yyyy-MM-dd/9999.log
-						String logFileName = XxlJobFileAppender.makeLogFileName(new Date(triggerParam.getLogDateTim()), triggerParam.getLogId());
-
-						XxlJobFileAppender.contextHolder.set(logFileName);
-						ShardingUtil.setShardingVo(new ShardingUtil.ShardingVO(triggerParam.getBroadcastIndex(), triggerParam.getBroadcastTotal()));
-						XxlJobLogger.log("<br>----------- xxl-job job execute start -----------<br>----------- Params:" + Arrays.toString(handlerParams));
-
-						executeResult = handler.execute(handlerParams);
-						if (executeResult == null) {
-							executeResult = ReturnT.FAIL;
-						}
-
-						XxlJobLogger.log("<br>----------- xxl-job job execute end(finish) -----------<br>----------- ReturnT:" + executeResult);
-					} catch (Exception e) {
-						if (toStop) {
-							XxlJobLogger.log("<br>----------- JobThread toStop, stopReason:" + stopReason);
-						}
-
-						StringWriter stringWriter = new StringWriter();
-						e.printStackTrace(new PrintWriter(stringWriter));
-						String errorMsg = stringWriter.toString();
-						executeResult = new ReturnT<String>(ReturnT.FAIL_CODE, errorMsg);
-
-						XxlJobLogger.log("<br>----------- JobThread Exception:" + errorMsg + "<br>----------- xxl-job job execute end(error) -----------");
-					}
-					
-					// callback handler info
-					if (!toStop) {
-						// commonm
-						TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), executeResult));
-					} else {
-						// is killed
-						ReturnT<String> stopResult = new ReturnT<String>(ReturnT.FAIL_CODE, stopReason + " [业务运行中,被强制终止]");
-						TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult));
-					}
-				} else {
-					if (idleTimes > 30) {
-						XxlJobExecutor.removeJobThread(jobId, "excutor idel times over limit.");
-					}
-				}
-			} catch (Throwable e) {
-				if (toStop) {
-					XxlJobLogger.log("<br>----------- xxl-job toStop, stopReason:" + stopReason);
-				}
-
-				StringWriter stringWriter = new StringWriter();
-				e.printStackTrace(new PrintWriter(stringWriter));
-				String errorMsg = stringWriter.toString();
-				XxlJobLogger.log("----------- xxl-job JobThread Exception:" + errorMsg);
-			}
-		}
-		
-		// callback trigger request in queue
-		while(triggerQueue !=null && triggerQueue.size()>0){
-			TriggerParam triggerParam = triggerQueue.poll();
-			if (triggerParam!=null) {
-				// is killed
-				ReturnT<String> stopResult = new ReturnT<String>(ReturnT.FAIL_CODE, stopReason + " [任务尚未执行,在调度队列中被终止]");
-				TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult));
-			}
-		}
-		
-		logger.info(">>>>>>>>>>> xxl-job JobThread stoped, hashCode:{}", Thread.currentThread());
-	}
+
+        while(!toStop){
+            running = false;
+            idleTimes++;
+            // handle job
+            ReturnT<String> executeResult = null;
+            TriggerParam triggerParam = null;
+            try {
+                // to check toStop signal, we need cycle, so wo cannot use queue.take(), instand of poll(timeout)
+                triggerParam = triggerQueue.poll(3L, TimeUnit.SECONDS);
+                if (triggerParam!=null) {
+                    running = true;
+                    idleTimes = 0;
+                    triggerLogIdSet.remove(triggerParam.getLogId());
+
+                    // parse param
+                    String[] handlerParams = (triggerParam.getExecutorParams()!=null && triggerParam.getExecutorParams().trim().length()>0)
+                        ? (String[])(Arrays.asList(triggerParam.getExecutorParams().split(" ")).toArray()) : null;
+
+
+                    try {
+                        // log filename: yyyy-MM-dd/9999.log
+                        String logFileName = XxlJobFileAppender.makeLogFileName(new Date(triggerParam.getLogDateTim()), triggerParam.getLogId());
+
+                        XxlJobFileAppender.contextHolder.set(logFileName);
+                        ShardingUtil.setShardingVo(new ShardingUtil.ShardingVO(triggerParam.getBroadcastIndex(), triggerParam.getBroadcastTotal()));
+                        XxlJobLogger.log("<br>----------- xxl-job job execute start -----------<br>----------- Params:" + Arrays.toString(handlerParams));
+
+                        executeResult = handler.execute(handlerParams);
+                        if (executeResult == null) {
+                            executeResult = ReturnT.FAIL;
+                        }
+
+                        XxlJobLogger.log("<br>----------- xxl-job job execute end(finish) -----------<br>----------- ReturnT:" + executeResult);
+                    } catch (Exception e) {
+                        if (toStop) {
+                            XxlJobLogger.log("<br>----------- JobThread toStop, stopReason:" + stopReason);
+                        }
+
+                        StringWriter stringWriter = new StringWriter();
+                        e.printStackTrace(new PrintWriter(stringWriter));
+                        String errorMsg = stringWriter.toString();
+                        executeResult = new ReturnT<String>(ReturnT.FAIL_CODE, errorMsg);
+
+                        XxlJobLogger.log("<br>----------- JobThread Exception:" + errorMsg + "<br>----------- xxl-job job execute end(error) -----------");
+                    }
+
+                } else {
+                    if (idleTimes > 30) {
+                        XxlJobExecutor.removeJobThread(jobId, "excutor idel times over limit.");
+                    }
+                }
+            } catch (Throwable e) {
+                if (toStop) {
+                    XxlJobLogger.log("<br>----------- xxl-job toStop, stopReason:" + stopReason);
+                }
+
+                StringWriter stringWriter = new StringWriter();
+                e.printStackTrace(new PrintWriter(stringWriter));
+                String errorMsg = stringWriter.toString();
+                executeResult = new ReturnT<String>(ReturnT.FAIL_CODE, errorMsg);
+
+                XxlJobLogger.log("----------- xxl-job JobThread Exception:" + errorMsg);
+            } finally {
+                if(triggerParam != null) {
+                    // callback handler info
+                    if (!toStop) {
+                        // commonm
+                        TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), executeResult));
+                    } else {
+                        // is killed
+                        ReturnT<String> stopResult = new ReturnT<String>(ReturnT.FAIL_CODE, stopReason + " [业务运行中,被强制终止]");
+                        TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult));
+                    }
+                }
+            }
+        }
+
+        // callback trigger request in queue
+        while(triggerQueue !=null && triggerQueue.size()>0){
+            TriggerParam triggerParam = triggerQueue.poll();
+            if (triggerParam!=null) {
+                // is killed
+                ReturnT<String> stopResult = new ReturnT<String>(ReturnT.FAIL_CODE, stopReason + " [任务尚未执行,在调度队列中被终止]");
+                TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult));
+            }
+        }
+
+        logger.info(">>>>>>>>>>>> xxl-job JobThread stoped, hashCode:{}", Thread.currentThread());
+    }
 }
 }