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.dao.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<OrderQueryTask> 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<String> 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<OrderQueryTask> 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;
|
}
|
}
|
|
|
|
}
|