WANG 5 gadi atpakaļ
vecāks
revīzija
6652e3df99

+ 3 - 7
src/main/java/cn/com/qmth/examcloud/web/actuator/ApiStatusEndpoint.java

@@ -3,6 +3,7 @@ package cn.com.qmth.examcloud.web.actuator;
 import java.lang.reflect.Field;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -53,12 +54,7 @@ public class ApiStatusEndpoint {
 	@ReadOperation(produces = {MediaType.TEXT_HTML_VALUE})
 	public String get(@Selector String order) {
 
-		System.out.println("order by " + order);
-		ReportorHolder.getApiDataReportor().report();
-		List<ReportInfo> reportInfoList = ReportorHolder.getApiDataReportor().getReportInfoList();
-
-		ReportInfo reportInfo = reportInfoList.get(0);
-		List<ApiStatusInfo> list = apiStatusInfoCollector.collect(reportInfo);
+		List<ApiStatusInfo> list = ApiStatusInfoHolder.getApiStatusInfoList();
 
 		Collections.sort(list, new Comparator<ApiStatusInfo>() {
 			@Override
@@ -91,7 +87,7 @@ public class ApiStatusEndpoint {
 
 		Map<String, Object> map = Maps.newHashMap();
 		map.put("data", list);
-		map.put("dateTime", reportInfo.getDateTime());
+		map.put("dateTime", new Date());
 
 		String html = ResourceLoader.getResource("api-status.html");
 

+ 0 - 8
src/main/java/cn/com/qmth/examcloud/web/actuator/ApiStatusInfoCollector.java

@@ -2,11 +2,9 @@ package cn.com.qmth.examcloud.web.actuator;
 
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.TimeUnit;
 
 import org.springframework.stereotype.Component;
 
-import com.codahale.metrics.ConsoleReporter;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
@@ -17,14 +15,8 @@ import cn.com.qmth.examcloud.web.support.ApiInfoHolder;
 @Component
 public class ApiStatusInfoCollector {
 
-	private static ConsoleReporter consoleReporter = ConsoleReporter
-			.forRegistry(MetricRegistryHolder.getDefalut()).convertRatesTo(TimeUnit.SECONDS)
-			.convertDurationsTo(TimeUnit.MILLISECONDS).build();
-
 	public synchronized List<ApiStatusInfo> collect(ReportInfo reportInfo) {
 
-		ReportorHolder.getApiDataReportor().report();
-		consoleReporter.report();
 		List<HistogramInfo> histogramInfoList = reportInfo.getHistogramInfoList();
 		List<MeterInfo> meterInfoList = reportInfo.getMeterInfoList();
 

+ 77 - 0
src/main/java/cn/com/qmth/examcloud/web/actuator/ApiStatusInfoHolder.java

@@ -0,0 +1,77 @@
+package cn.com.qmth.examcloud.web.actuator;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
+import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
+import cn.com.qmth.examcloud.commons.util.Util;
+import cn.com.qmth.examcloud.web.support.SpringContextHolder;
+
+@Component
+@Order(1000)
+public class ApiStatusInfoHolder implements ApplicationRunner {
+
+	private static final ExamCloudLog LOG = ExamCloudLogFactory.getLog(ApiStatusInfoHolder.class);
+
+	private static Map<String, ApiStatusInfo> apiStatusInfoMap = Maps.newHashMap();
+
+	private static List<ApiStatusInfo> apiStatusInfoList = Lists.newArrayList();
+
+	public static ApiStatusInfo getApiStatusInfo(String mapping) {
+		return apiStatusInfoMap.get(mapping);
+	}
+
+	public static List<ApiStatusInfo> getApiStatusInfoList() {
+		refresh();
+		return apiStatusInfoList;
+	}
+
+	@Override
+	public void run(ApplicationArguments args) throws Exception {
+
+		new Thread(new Runnable() {
+			@Override
+			public void run() {
+				while (true) {
+					Util.sleep(10);
+					refresh();
+				}
+			}
+
+		}).start();
+	}
+
+	private static synchronized void refresh() {
+		try {
+			ReportorHolder.getApiDataReportor().report();
+			List<ReportInfo> reportInfoList = ReportorHolder.getApiDataReportor()
+					.getReportInfoList();
+
+			ReportInfo reportInfo = reportInfoList.get(0);
+			ApiStatusInfoCollector apiStatusInfoCollector = SpringContextHolder
+					.getBean(ApiStatusInfoCollector.class);
+			apiStatusInfoList = apiStatusInfoCollector.collect(reportInfo);
+
+			Map<String, ApiStatusInfo> newApiInfoMap = apiStatusInfoList.stream()
+					.collect(Collectors.toMap(ApiStatusInfo::getMapping, info -> info));
+
+			apiStatusInfoMap = newApiInfoMap;
+
+		} catch (Exception e) {
+			LOG.error("fail to refresh API status.", e);
+		}
+
+		Util.sleep(1);
+	}
+
+}

+ 3 - 39
src/main/java/cn/com/qmth/examcloud/web/interceptor/ApiFlowLimitedInterceptor.java

@@ -1,9 +1,7 @@
 package cn.com.qmth.examcloud.web.interceptor;
 
-import java.util.List;
 import java.util.Map;
 import java.util.Properties;
-import java.util.stream.Collectors;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -17,17 +15,13 @@ import com.googlecode.aviator.AviatorEvaluator;
 
 import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
 import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.commons.util.PathUtil;
 import cn.com.qmth.examcloud.commons.util.PropertiesUtil;
 import cn.com.qmth.examcloud.commons.util.Util;
 import cn.com.qmth.examcloud.web.actuator.ApiStatusInfo;
-import cn.com.qmth.examcloud.web.actuator.ApiStatusInfoCollector;
-import cn.com.qmth.examcloud.web.actuator.ReportInfo;
-import cn.com.qmth.examcloud.web.actuator.ReportorHolder;
+import cn.com.qmth.examcloud.web.actuator.ApiStatusInfoHolder;
 import cn.com.qmth.examcloud.web.enums.HttpServletRequestAttribute;
 import cn.com.qmth.examcloud.web.support.ApiInfo;
 import cn.com.qmth.examcloud.web.support.ServletUtil;
-import cn.com.qmth.examcloud.web.support.SpringContextHolder;
 import cn.com.qmth.examcloud.web.support.StatusResponse;
 
 /**
@@ -42,39 +36,10 @@ public class ApiFlowLimitedInterceptor implements HandlerInterceptor {
 	private static final ExamCloudLog LOG = ExamCloudLogFactory
 			.getLog(ApiFlowLimitedInterceptor.class);
 
-	private static Map<String, ApiStatusInfo> apiInfoMap = Maps.newHashMap();
-
 	private static Properties props = new Properties();
 
 	static {
 
-		new Thread(new Runnable() {
-			@Override
-			public void run() {
-				Util.sleep(10);
-				while (true) {
-					try {
-						ReportorHolder.getApiDataReportor().report();
-						List<ReportInfo> reportInfoList = ReportorHolder.getApiDataReportor()
-								.getReportInfoList();
-
-						ReportInfo reportInfo = reportInfoList.get(0);
-						ApiStatusInfoCollector apiStatusInfoCollector = SpringContextHolder
-								.getBean(ApiStatusInfoCollector.class);
-						List<ApiStatusInfo> list = apiStatusInfoCollector.collect(reportInfo);
-
-						Map<String, ApiStatusInfo> newApiInfoMap = list.stream()
-								.collect(Collectors.toMap(ApiStatusInfo::getMapping, info -> info));
-
-						apiInfoMap = newApiInfoMap;
-
-					} catch (Exception e) {
-						LOG.error("fail to refresh API status.", e);
-					}
-				}
-			}
-		}).start();
-
 		new Thread(new Runnable() {
 			@Override
 			public void run() {
@@ -83,8 +48,7 @@ public class ApiFlowLimitedInterceptor implements HandlerInterceptor {
 					try {
 						Properties newProps = new Properties();
 
-						PropertiesUtil.loadFromResource(
-								PathUtil.getResoucePath("limited.properties"), newProps);
+						PropertiesUtil.loadFromResource("limited.properties", newProps);
 
 						props = newProps;
 
@@ -111,7 +75,7 @@ public class ApiFlowLimitedInterceptor implements HandlerInterceptor {
 
 		ApiStatusInfo apiStatusInfo = null;
 		try {
-			apiStatusInfo = apiInfoMap.get(apiInfo.getMapping());
+			apiStatusInfo = ApiStatusInfoHolder.getApiStatusInfo(apiInfo.getMapping());
 		} catch (Exception e) {
 			// ignore
 		}