java的非阻塞不限界队列使用

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值