package com.sandu.ximon.admin.security.order; import com.alibaba.fastjson.JSON; import com.sandu.ximon.admin.config.C3mRedisConfig; import com.sandu.ximon.admin.utils.LogUtils; import com.sandu.ximon.admin.utils.RedisUtils; import com.sandu.ximon.dao.domain.C3mOrder; import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3mRedisConstant; import lombok.Data; import java.util.Date; import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentLinkedQueue; @Data public class OrderQueryTask implements Runnable{ private static Queue taskList = new ConcurrentLinkedQueue<>(); // 任务类型:C3订单扫描(0)、 private Integer type; // 是否继续扫描 private boolean isScanning = true; public void stopTask(){ this.isScanning = false; } public OrderQueryTask(Integer type) { this.type = type; } @Override public void run() { /** * 启动后,终止所有相同类型的扫描任务 */ stopAndAddTask(type, this); for(OrderQueryTask task :taskList) { if(task.getType().equals(0)){ // 启动C3订单扫描 c3mOrderTaskScan(); } } } private void c3mOrderTaskScan() { LogUtils.error("启动C3m订单扫描任务"); Long totalTime = 0L; // 继续扫描时,进行循环扫描 while(isScanning) { totalTime = totalTime + C3mRedisConfig.ORDER_QUERY_TIME; // 判断扫描时长是否已超出订单超时时间 if(totalTime > C3mRedisConfig.ORDER_MAX_TIME) { return; } // 等待扫描间隔 try { Thread.sleep(C3mRedisConfig.ORDER_QUERY_TIME * 1000); } catch (InterruptedException e) { e.printStackTrace(); } // 判断是否继续扫描 if(isScanning) { /** * 获取所有订单,根据订单类型不同进行不同的Query */ // C3充电桩部分 RedisUtils redisUtils = RedisUtils.getBean(); Set keys = redisUtils.keys(C3mRedisConstant.C3_NO_PAY_ORDER.getCode() + "*"); for (String key : keys) { C3mOrder c3mOrderEntity = JSON.parseObject(redisUtils.get(key), C3mOrder.class); LogUtils.error("当前订单总数:"+keys.size()+",推送查询订单("+c3mOrderEntity.getOutTradeNo()+")到事件处理:" + JSON.toJSONString(c3mOrderEntity)); OrderQueryListener.getBean().publisher.publishEvent(new C3mOrderQueryEvent(this, c3mOrderEntity, new Date().getTime())); } }else { return; } } } public void stopAndAddTask (Integer type, OrderQueryTask newTask) { synchronized (OrderQueryTask.class) { LogUtils.error("重置并清空订单扫描队列"); boolean clear = true; Queue newTaskList = new ConcurrentLinkedQueue<>(); newTaskList.offer(newTask); while (clear) { OrderQueryTask task = taskList.poll(); if (null == task) { clear = false; } else { if (task.getType().equals(type)) { task.stopTask(); } else { newTaskList.offer(task); } } } taskList = newTaskList; } } }