From ed8fc5f674544d3af63c6f68093ffc038385c493 Mon Sep 17 00:00:00 2001 From: dongyukun <1208714201@qq.com> Date: 星期一, 16 十二月 2024 09:30:04 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/ihdb/HttpCollectorForIhd.java | 153 +++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 125 insertions(+), 28 deletions(-) diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/ihdb/HttpCollectorForIhd.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/ihdb/HttpCollectorForIhd.java index 1d14ce4..df09772 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/ihdb/HttpCollectorForIhd.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/ihdb/HttpCollectorForIhd.java @@ -12,6 +12,7 @@ import com.iailab.module.data.common.utils.HttpRequest; import com.iailab.module.data.common.utils.TagUtils; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundHashOperations; import org.springframework.data.redis.core.RedisTemplate; @@ -20,8 +21,14 @@ import java.math.BigDecimal; import java.math.RoundingMode; +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.util.*; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * iHyperDB采集 @@ -33,7 +40,7 @@ @Slf4j @Component public class HttpCollectorForIhd { - private Map<String, HttpApiEntity> apiMap = new HashMap<>(); + private static Map<String, HttpApiEntity> apiMap = new HashMap<>(); @Autowired private HttpApiService httpApiService; @@ -41,9 +48,14 @@ @Autowired private RedisTemplate redisTemplate; + ThreadPoolExecutor threadPool = new ThreadPoolExecutor(18, 36, 30, TimeUnit.SECONDS, + new ArrayBlockingQueue<Runnable>(36), new ThreadPoolExecutor.AbortPolicy()); + private static final String STA_TRUE = "true"; - private static final int GROUP_MAX_COUNT = 50; + private static final int GROUP_MAX_COUNT = 300; + + private static final int MAX_WAIT = 30; private static final String pattern = "yyyyMMddHHmm00"; @@ -169,35 +181,120 @@ return result; } - public Map<String, Object> getTagValues(List<Object[]> params) { + public Map<String, Object> getTagValues(List<Object[]> params, Date collectTime) { + Map<String, Object> result = new HashMap<>(); if (CollectionUtils.isEmpty(params)) { return new HashMap<>(); } + try { + Map<Integer, List<Object[]>> measurePointsCountGroup = new HashMap<>(); + int pointListSize = params.size(); + int groupCount = pointListSize / GROUP_MAX_COUNT + ((pointListSize % GROUP_MAX_COUNT) > 0 ? 1 : 0); + log.info("groupCount=" + groupCount); + for (int i = 0; i < groupCount; i++) { + int end = (i + 1) * GROUP_MAX_COUNT; + if (end > pointListSize) { + end = pointListSize; + } + measurePointsCountGroup.put(i, params.subList(i * GROUP_MAX_COUNT, end)); + } + log.info("measurePointsCountGroup.size()=" + measurePointsCountGroup.size()); + result = new ConcurrentHashMap<>(params.size()); + CountDownLatch countDownLatch = new CountDownLatch(measurePointsCountGroup.size()); + for (Map.Entry<Integer, List<Object[]>> measurePointsItem : measurePointsCountGroup.entrySet()) { + HttpApiEntity httpApi = this.getHttpApi(measurePointsItem.getValue().get(0)[0].toString()); + // 并发 + Thread.sleep(1000); + threadPool.submit(new Task(httpApi.getUrl(), httpApi.getCode(), result, measurePointsItem.getValue(), + collectTime, countDownLatch)); + // 顺序 + //this.getByHtp(result, measurePointsItem.getValue(), collectTime); + } + countDownLatch.await(MAX_WAIT, TimeUnit.SECONDS); - Map<Integer, List<Object[]>> measurePointsCountGroup = new HashMap<>(); - int pointListSize = params.size(); - int groupCount = pointListSize / GROUP_MAX_COUNT + ((pointListSize % GROUP_MAX_COUNT) > 0 ? 1 : 0); - log.info("groupCount=" + groupCount); - for (int i = 0; i < groupCount; i++) { - int end = (i + 1) * GROUP_MAX_COUNT; - if (end > pointListSize) { - end = pointListSize; - } - measurePointsCountGroup.put(i, params.subList(i * GROUP_MAX_COUNT, end)); - } - Map<String, Object> result = new HashMap<>(params.size()); - for (Map.Entry<Integer, List<Object[]>> measurePointsItem : measurePointsCountGroup.entrySet()) { - try { - getByHtp(result, measurePointsItem.getValue()); - } catch (Exception ex) { - ex.printStackTrace(); - } + } catch (Exception ex) { + ex.printStackTrace(); } return result; } - private void getByHtp(Map<String, Object> result, List<Object[]> params) { - HttpApiEntity httpApi = this.getHttpApi(params.get(0)[0].toString()); + /** + * 异步采集任务 + */ + private class Task implements Runnable { + String url; + String sourceName; + Date collectTime; + Map<String, Object> result; + List<Object[]> params; + CountDownLatch countDownLatch; + + public Task(String url, String sourceName, Map<String, Object> result, List<Object[]> params, + Date collectTime, CountDownLatch countDownLatch) { + this.url = url; + this.sourceName = sourceName; + this.result = result; + this.collectTime = collectTime; + this.params = params; + this.countDownLatch = countDownLatch; + } + + @Override + public void run() { + try { + log.info("请求的Tag数量:" + params.size()); + this.getByHtp(url, sourceName, result, params, collectTime); + log.info("请求结束:url=" + url); + } catch (Exception ex) { + log.info("获取采集值失败," + ex.getMessage()); + ex.printStackTrace(); + } finally { + countDownLatch.countDown(); + } + } + + /** + * getTagDataByHttp + * + * @param url + * @param sourceName + * @param result + * @param params + * @param collectTime + */ + private void getByHtp(String url, String sourceName, Map<String, Object> result, List<Object[]> params, Date collectTime) { + StringBuilder tagSb = new StringBuilder(); + tagSb.append("["); + for (int i = 0; i < params.size(); i++) { + Map<String, Object> queryParams = new HashMap<>(3); + queryParams.put(N, params.get(i)[1]); + queryParams.put(D, params.get(i)[2]); + queryParams.put(P, params.get(i)[3]); + String jsonString = JSON.toJSONString(queryParams); + tagSb.append(jsonString); + if (i < params.size() - 1) { + tagSb.append(","); + } + } + tagSb.append("]"); + log.info("body=====" + tagSb); + String currentDate = DateUtils.format(collectTime, pattern); + String responseStr = HttpRequest.sendPost(url + "/" + currentDate, tagSb.toString()); + JSONObject responseObj = JSON.parseObject(responseStr); + log.info("responseObj=====" + responseObj.toJSONString()); + if (STA_TRUE.equals(responseObj.get(IS_SUCCESS).toString())) { + JSONArray tagValueList = responseObj.getJSONArray("data"); + if (!CollectionUtils.isEmpty(tagValueList)) { + for (int i = 0; i < tagValueList.size(); i++) { + JSONObject item = tagValueList.getJSONObject(i); + result.put(TagUtils.genTagId(DataSourceType.HTTP.getCode(), sourceName, item.get(N).toString()), item.get(V)); + } + } + } + } + } + + private void getByHtp(String url, String sourceName, Map<String, Object> result, List<Object[]> params, Date collectTime) { StringBuilder tagSb = new StringBuilder(); tagSb.append("["); for (int i = 0; i < params.size(); i++) { @@ -212,9 +309,9 @@ } } tagSb.append("]"); - log.info("body=====" + tagSb.toString()); - String currentDate = DateUtils.format(new Date(), pattern); - String responseStr = HttpRequest.sendPost(httpApi.getUrl() + "/" + currentDate, tagSb.toString()); + log.info("body=====" + tagSb); + String currentDate = DateUtils.format(collectTime, pattern); + String responseStr = HttpRequest.sendPost(url + "/" + currentDate, tagSb.toString()); JSONObject responseObj = JSON.parseObject(responseStr); log.info("responseObj=====" + responseObj.toJSONString()); if (STA_TRUE.equals(responseObj.get(IS_SUCCESS).toString())) { @@ -222,7 +319,7 @@ if (!CollectionUtils.isEmpty(tagValueList)) { for (int i = 0; i < tagValueList.size(); i++) { JSONObject item = tagValueList.getJSONObject(i); - result.put(TagUtils.genTagId(DataSourceType.HTTP.getCode(), httpApi.getCode(), item.get(N).toString()), item.get(V)); + result.put(TagUtils.genTagId(DataSourceType.HTTP.getCode(), sourceName, item.get(N).toString()), item.get(V)); } } } -- Gitblit v1.9.3