package com.gyee.alarm.service; import com.gyee.alarm.feigns.IAlarmService; import com.gyee.alarm.model.vo.AlarmSuperTalbeType; import com.gyee.alarm.model.vo.AlarmTag; import com.gyee.alarm.task.thread.AlarmThread; import com.gyee.alarm.util.realtimesource.IEdosUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; @Service @Slf4j public class AlarmScannerService { @Value("${task-count}") private Integer taskCount; @Value("${interval}") private Integer interval; @Value("${alarmType}") private String alarmType; @Value("${read-rows}") private Integer readRows; @Resource private IEdosUtil edosUtil; @Resource private IAlarmService alarmService; private List alarmTags=new ArrayList<>(); @Resource @Qualifier(value = "taskExecutor") private Executor executor; /** * 初始化 */ public void init() { //#WT("wt_alarms", "设备报警超级表"), //#BT("bt_alarms", "升压站报警超级表"), //#IN("in_alarms", "逆变器报警超级表"), switch (alarmType){ case "wt_alarms": alarmTags =alarmService.findTagsByWt(); break; case "bt_alarms": alarmTags =alarmService.findTagsByBt(); break; case "in_alarms": alarmTags =alarmService.findTagsByIn(); break; } } /** * 分配任务 */ public void taskJobs(boolean start) throws InterruptedException { while (start) { int len = 1; List alarmls = new ArrayList<>(); int listNumber = alarmTags.size() / taskCount; int number = 0; if (alarmTags.size() % listNumber == 0) { number = taskCount; } else { number = taskCount + 1; } CountDownLatch countDownLatch = new CountDownLatch(number); StringBuilder str = new StringBuilder(); str.append("总数:").append(alarmTags.size()).append(",线程数:").append(number).append(",分块大小:").append(listNumber); log.info(String.valueOf(str)); for (int i = 0; i < alarmTags.size(); i++) { alarmls.add(alarmTags.get(i)); if (i != 0 && (i+1) % listNumber == 0) { new Thread(new AlarmThread(executor, edosUtil, alarmService, alarmls, interval, String.valueOf(len), readRows, alarmType,countDownLatch)).start(); alarmls = new ArrayList<>(); len++; } } if (!alarmls.isEmpty()) { new Thread(new AlarmThread(executor, edosUtil, alarmService, alarmls, interval, String.valueOf(len), readRows, alarmType,countDownLatch)).start(); } countDownLatch.await(); log.info("报警排查完成!"); try { Thread.sleep((interval * 500)); } catch (InterruptedException e) { throw new RuntimeException(e); } } } }