| | |
| | | |
| | | 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采集 |
| | |
| | | @Slf4j |
| | | @Component |
| | | public class HttpCollectorForIhd { |
| | | private Map<String, HttpApiEntity> apiMap = new HashMap<>(); |
| | | private static Map<String, HttpApiEntity> apiMap = new HashMap<>(); |
| | | |
| | | @Autowired |
| | | private HttpApiService httpApiService; |
| | |
| | | @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 = 100; |
| | | |
| | | private static final int MAX_WAIT = 30; |
| | | |
| | | private static final String pattern = "yyyyMMddHHmm00"; |
| | | |
| | |
| | | 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()); |
| | | |
| | | 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; |
| | | // 并发 |
| | | Thread.sleep(1000); |
| | | threadPool.submit(new Task(httpApi.getUrl(), httpApi.getCode(), result, measurePointsItem.getValue(), |
| | | collectTime, countDownLatch)); |
| | | |
| | | // 顺序 |
| | | //this.getByHtp(result, measurePointsItem.getValue(), collectTime); |
| | | } |
| | | 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(); |
| | | } |
| | | countDownLatch.await(MAX_WAIT, TimeUnit.SECONDS); |
| | | |
| | | } 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<>(); |
| | | 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++) { |
| | |
| | | } |
| | | } |
| | | 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())) { |
| | |
| | | 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)); |
| | | } |
| | | } |
| | | } |