| 
					
				 | 
			
			
				@@ -1,5 +1,6 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package com.xxl.job.client.handler;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Date;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.Map;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.concurrent.ConcurrentHashMap;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -7,6 +8,7 @@ import org.slf4j.Logger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.slf4j.LoggerFactory;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.xxl.job.client.util.HttpUtil.RemoteCallBack;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.xxl.job.client.log.XxlJobFileAppender;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.xxl.job.client.util.JacksonUtil;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /**
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -16,6 +18,9 @@ import com.xxl.job.client.util.JacksonUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 public class HandlerRepository {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	private static Logger logger = LoggerFactory.getLogger(HandlerRepository.class);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public static final String NAMESPACE = "namespace";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public enum NameSpaceEnum{RUN, KILL, LOG}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	public static final String HANDLER_ADDRESS = "handler_address";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	public static final String HANDLER_NAME = "handler_name";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	public static final String HANDLER_PARAMS = "handler_params";
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -35,36 +40,96 @@ public class HandlerRepository { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// handler push to queue
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public static String pushHandleQueue(Map<String, String> _param) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		logger.info(">>>>>>>>>>> xxl-job pushHandleQueue start, _param:{}", new Object[]{_param});
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public static String service(Map<String, String> _param) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logger.info(">>>>>>>>>>> xxl-job service start, _param:{}", new Object[]{_param});
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// callback
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		RemoteCallBack callback = new RemoteCallBack();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		callback.setStatus(RemoteCallBack.FAIL);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		// encryption check
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		long timestamp = _param.get(HandlerRepository.TRIGGER_TIMESTAMP)!=null?Long.valueOf(_param.get(HandlerRepository.TRIGGER_TIMESTAMP)):-1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (System.currentTimeMillis() - timestamp > 60000) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			callback.setMsg("Timestamp check failed.");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// check namespace
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		String namespace = _param.get(HandlerRepository.NAMESPACE);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (namespace==null || namespace.trim().length()==0) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			callback.setMsg("param[NAMESPACE] can not be null.");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return JacksonUtil.writeValueAsString(callback);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		// push data to queue
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String handler_name = _param.get(HandlerRepository.HANDLER_NAME);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (handler_name!=null && handler_name.trim().length()>0) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			HandlerThread handlerThread = handlerTreadMap.get(handler_name);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if (handlerThread != null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				handlerThread.pushData(_param);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				callback.setStatus(RemoteCallBack.SUCCESS);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} else {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				callback.setMsg("handler[" + handler_name + "] not found.");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// parse namespace
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (namespace.equals(HandlerRepository.NameSpaceEnum.RUN.name())) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// encryption check
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			long timestamp = _param.get(HandlerRepository.TRIGGER_TIMESTAMP)!=null?Long.valueOf(_param.get(HandlerRepository.TRIGGER_TIMESTAMP)):-1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (System.currentTimeMillis() - timestamp > 60000) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				callback.setMsg("Timestamp check failed.");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return JacksonUtil.writeValueAsString(callback);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// push data to queue
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			String handler_name = _param.get(HandlerRepository.HANDLER_NAME);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (handler_name!=null && handler_name.trim().length()>0) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				HandlerThread handlerThread = handlerTreadMap.get(handler_name);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (handlerThread != null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					handlerThread.pushData(_param);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					callback.setStatus(RemoteCallBack.SUCCESS);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} else {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					callback.setMsg("handler[" + handler_name + "] not found.");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}else{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				callback.setMsg("param[HANDLER_NAME] can not be null.");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else if (namespace.equals(HandlerRepository.NameSpaceEnum.LOG.name())) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			String trigger_log_id = _param.get(HandlerRepository.TRIGGER_LOG_ID);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			String trigger_timestamp = _param.get(HandlerRepository.TRIGGER_TIMESTAMP);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (trigger_log_id==null || trigger_timestamp==null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				callback.setMsg("trigger_log_id | trigger_timestamp can not be null.");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return JacksonUtil.writeValueAsString(callback);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}else{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			callback.setMsg("param[HANDLER_NAME] can not be null.");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			int logId = -1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Date triggerDate = null;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			try {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				logId = Integer.valueOf(trigger_log_id);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				triggerDate = new Date(Long.valueOf(trigger_timestamp));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} catch (Exception e) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (logId<=0 || triggerDate==null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				callback.setMsg("trigger_log_id | trigger_timestamp is not parsed valid.");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return JacksonUtil.writeValueAsString(callback);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			String logConteng = XxlJobFileAppender.readLog(triggerDate, trigger_log_id);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			callback.setStatus(RemoteCallBack.SUCCESS);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			callback.setMsg(logConteng);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else if (namespace.equals(HandlerRepository.NameSpaceEnum.KILL.name())) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// encryption check
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			long timestamp = _param.get(HandlerRepository.TRIGGER_TIMESTAMP)!=null?Long.valueOf(_param.get(HandlerRepository.TRIGGER_TIMESTAMP)):-1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (System.currentTimeMillis() - timestamp > 60000) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				callback.setMsg("Timestamp check failed.");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return JacksonUtil.writeValueAsString(callback);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// kill handlerThread, and create new one
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			String handler_name = _param.get(HandlerRepository.HANDLER_NAME);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (handler_name!=null && handler_name.trim().length()>0) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				HandlerThread handlerThread = handlerTreadMap.get(handler_name);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (handlerThread != null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					IJobHandler handler = handlerThread.getHandler();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					handlerThread.toStop();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					handlerThread.interrupt();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					regist(handler_name, handler);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					callback.setStatus(RemoteCallBack.SUCCESS);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} else {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					callback.setMsg("handler[" + handler_name + "] not found.");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}else{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				callback.setMsg("param[HANDLER_NAME] can not be null.");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			callback.setMsg("param[NAMESPACE] is not valid.");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return JacksonUtil.writeValueAsString(callback);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		logger.info(">>>>>>>>>>> xxl-job pushHandleQueue end, triggerData:{}", new Object[]{callback});
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return JacksonUtil.writeValueAsString(callback);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logger.info(">>>>>>>>>>> xxl-job service end, triggerData:{}", new Object[]{callback});
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return JacksonUtil.writeValueAsString(callback); 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }
 
			 |