2021与蓝度共同重构项目,服务端
MercuryZ
2022-03-31 ef270bd1855b5ce3f398c5df024840a498e33a8f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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;
        }
    }
 
 
 
}