1.任务调度线程池
@Configuration
public class ThreadConfigurer {
//任务调度线程池
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
//大小
scheduler.setPoolSize(10);
//使用时的线程名
scheduler.setThreadNamePrefix(“task-”);
//线程池等待策略
scheduler.setWaitForTasksToCompleteOnShutdown(true);
return scheduler;
}
}
目的:定时任务,把任务削峰填谷
2.创建队列并使用队列
@Service
@Slf4j
public class QueueService {
@Resource
private ISchoolManageService schoolManageService;
@Resource
private MonitorManageService monitorManageService;
@Resource
private CameraService cameraService;
@Resource
private Duty duty;
//非阻塞不限界队列
public static ConcurrentLinkedQueue<QueueObj> schoolAlgoLinkedQueue=new ConcurrentLinkedQueue<>();
//向队列里面插数据,插入头
public void putIn(QueueObj queueObj){
log.info("开始插入队列:{}",queueObj);
try{
schoolAlgoLinkedQueue.add(queueObj);
}catch (Exception e){
e.getLocalizedMessage();
}
log.info("结束插入队列:{}",queueObj);
}
//从队列里面取头数据并删除头
public QueueObj takeOut(){
if(!schoolAlgoLinkedQueue.isEmpty()){
try{
QueueObj queueObj = schoolAlgoLinkedQueue.poll();
log.info("队列中取得数据:{}",queueObj);
return queueObj;
}catch (Exception e){
return null;
}
}else{
return null;
}
}
public void algoScheduleTaskPutIn() {
log.info("开始插入学校算法");
//获取所有学校
List<Exchange> schoolList = monitorManageService.getAllSchoolList();
//获取学校算法
schoolList.forEach(h -> {
PageInfo p = new PageInfo();
p.setPageNum(1);
p.setPageSize(50);
String s = duty.getAlgorith(h.getSchoolLoginName(), h.getPassword(), p);
if (StringUtils.isNotBlank(s)) {
QueueObj queueObj = new QueueObj();
queueObj.setObjType(QueueObjCode.QUEUE_OBJTYPE_ALGO);
queueObj.setObj(s);
queueObj.setUniqueCode(h.getId().toString());
//把对象插入队列
putIn(queueObj);
}
});
log.info("插入学校算法结束");
}
public void scheduleTaskHandle() {
QueueObj queueObj = takeOut();
try{
if (Objects.nonNull(queueObj)) {
int code = queueObj.getObjType();
switch (code) {
case 1://学校算法处理
schoolManageService.addSchoolAlgoByJsonStr((String) queueObj.getObj(), queueObj.getUniqueCode());
break;
case 2://处理单个设备
cameraService.handleCameraOne((HashMap<String,Object>)queueObj.getObj());
break;
}
}
}catch (Exception e){
e.getLocalizedMessage();
}
}
}
3.定时任务
@Component
@EnableScheduling
@Slf4j
public class ScheduleTask {
//学校算法同步,插入队列
@Scheduled(cron = "${scheduletask.cron.schoolalgo}")
void algoScheduleTaskPutIn() {
queueService.algoScheduleTaskPutIn();
}
//每500毫秒执行一次,从队列里抽出数据并处理
@Scheduled(fixedDelay = 500)
void scheduleTaskHandle() {
queueService.scheduleTaskHandle();
}
}
4.队列对象
public class QueueObj {
private Integer objType;
private Object obj;
private String uniqueCode;
}