浏览代码

远程调度增强校验:1、调度中心与执行器时间偏移超过60秒拒绝任务执行;2、执行器校验调度uuid避免一次调度重复执行;

xueli.xue 9 年前
父节点
当前提交
ee9eca0db7

+ 1 - 0
xxl-job-admin/src/main/java/com/xxl/job/service/job/RemoteHttpJobBean.java 查看文件

@@ -57,6 +57,7 @@ public class RemoteHttpJobBean extends QuartzJobBean {
57 57
 		HashMap<String, String> params = new HashMap<String, String>();
58 58
 		params.put(HandlerRepository.TRIGGER_LOG_URL, PropertiesUtil.getString(HandlerRepository.TRIGGER_LOG_URL));
59 59
 		params.put(HandlerRepository.TRIGGER_LOG_ID, String.valueOf(jobLog.getId()));
60
+		params.put(HandlerRepository.TRIGGER_TIMESTAMP, String.valueOf(System.currentTimeMillis()));
60 61
 		params.put(HandlerRepository.HANDLER_NAME, jobDataMap.get(HandlerRepository.HANDLER_NAME));
61 62
 		params.put(HandlerRepository.HANDLER_PARAMS, jobDataMap.get(HandlerRepository.HANDLER_PARAMS));
62 63
 

+ 8 - 0
xxl-job-client/src/main/java/com/xxl/job/client/handler/HandlerRepository.java 查看文件

@@ -22,6 +22,7 @@ public class HandlerRepository {
22 22
 	
23 23
 	public static final String TRIGGER_LOG_ID = "trigger_log_id";
24 24
 	public static final String TRIGGER_LOG_URL = "trigger_log_url";
25
+	public static final String TRIGGER_TIMESTAMP = "trigger_timestamp";
25 26
 	
26 27
 	public static ConcurrentHashMap<String, HandlerThread> handlerTreadMap = new ConcurrentHashMap<String, HandlerThread>();
27 28
 	
@@ -41,6 +42,13 @@ public class HandlerRepository {
41 42
 		RemoteCallBack callback = new RemoteCallBack();
42 43
 		callback.setStatus(RemoteCallBack.FAIL);
43 44
 		
45
+		// encryption check
46
+		long timestamp = _param.get(HandlerRepository.TRIGGER_TIMESTAMP)!=null?Long.valueOf(_param.get(HandlerRepository.TRIGGER_TIMESTAMP)):-1;
47
+		if (System.currentTimeMillis() - timestamp > 60000) {
48
+			callback.setMsg("Timestamp check failed.");
49
+			return JacksonUtil.writeValueAsString(callback);
50
+		}
51
+				
44 52
 		// push data to queue
45 53
 		String handler_name = _param.get(HandlerRepository.HANDLER_NAME);
46 54
 		if (handler_name!=null && handler_name.trim().length()>0) {

+ 11 - 4
xxl-job-client/src/main/java/com/xxl/job/client/handler/HandlerThread.java 查看文件

@@ -7,6 +7,7 @@ import java.util.Map;
7 7
 import java.util.concurrent.LinkedBlockingQueue;
8 8
 import java.util.concurrent.TimeUnit;
9 9
 
10
+import org.eclipse.jetty.util.ConcurrentHashSet;
10 11
 import org.slf4j.Logger;
11 12
 import org.slf4j.LoggerFactory;
12 13
 
@@ -23,14 +24,18 @@ public class HandlerThread extends Thread{
23 24
 	
24 25
 	private IJobHandler handler;
25 26
 	private LinkedBlockingQueue<Map<String, String>> handlerDataQueue;
27
+	private ConcurrentHashSet<String> logIdSet;		// avoid repeat trigger for the same TRIGGER_LOG_ID
26 28
 	
27 29
 	public HandlerThread(IJobHandler handler) {
28 30
 		this.handler = handler;
29 31
 		handlerDataQueue = new LinkedBlockingQueue<Map<String,String>>();
32
+		logIdSet = new ConcurrentHashSet<String>();
30 33
 	}
31 34
 	
32 35
 	public void pushData(Map<String, String> param) {
33
-		handlerDataQueue.offer(param);
36
+		if (param.get(HandlerRepository.TRIGGER_LOG_ID)!=null && !logIdSet.contains(param.get(HandlerRepository.TRIGGER_LOG_ID))) {
37
+			handlerDataQueue.offer(param);
38
+		}
34 39
 	}
35 40
 	
36 41
 	int i = 1;
@@ -38,12 +43,13 @@ public class HandlerThread extends Thread{
38 43
 	public void run() {
39 44
 		while(true){
40 45
 			try {
41
-				i++;
42 46
 				Map<String, String> handlerData = handlerDataQueue.poll();
43 47
 				if (handlerData!=null) {
48
+					i= 0;
44 49
 					String trigger_log_url = handlerData.get(HandlerRepository.TRIGGER_LOG_URL);
45 50
 					String trigger_log_id = handlerData.get(HandlerRepository.TRIGGER_LOG_ID);
46 51
 					String handler_params = handlerData.get(HandlerRepository.HANDLER_PARAMS);
52
+					logIdSet.remove(trigger_log_id);
47 53
 					
48 54
 					// parse param
49 55
 					String[] handlerParams = null; 
@@ -68,9 +74,8 @@ public class HandlerThread extends Thread{
68 74
 					// callback handler info
69 75
 					RemoteCallBack callback = null;
70 76
 					try {
71
-						
72 77
 						HashMap<String, String> params = new HashMap<String, String>();
73
-						params.put(HandlerRepository.TRIGGER_LOG_ID, trigger_log_id);
78
+						params.put("trigger_log_id", trigger_log_id);
74 79
 						params.put("status", _status.name());
75 80
 						params.put("msg", _msg);
76 81
 						callback = HttpUtil.post(trigger_log_url, params);
@@ -80,6 +85,8 @@ public class HandlerThread extends Thread{
80 85
 					logger.info("<<<<<<<<<<< xxl-job thread handle, handlerData:{}, callback_status:{}, callback_msg:{}, callback:{}, thread:{}", 
81 86
 							new Object[]{handlerData, _status, _msg, callback, this});
82 87
 				} else {
88
+					i++;
89
+					logIdSet.clear();
83 90
 					try {
84 91
 						TimeUnit.MILLISECONDS.sleep(i * 100);
85 92
 					} catch (InterruptedException e) {