CZT
2023-11-27 68e19f643c315cfd639c8547f349fe2607282604
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package com.ld.igds.protocol.zldz.task;
 
import com.ld.igds.io.request.CheckGrainRequest;
import com.ld.igds.io.request.CheckThRequest;
import com.ld.igds.protocol.zldz.command.BaseRemoteImpl;
import com.ld.igds.protocol.zldz.util.ServerUtils;
import com.ld.igds.util.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
 
/**
 * 命令重发
 */
@Slf4j
@Component(CommandReSendService.BEAN_ID)
public class CommandReSendService extends BaseRemoteImpl {
 
    public static final String BEAN_ID = "zldz.commandReSendService";
 
    public static final String REDIS_KEY_RESEND_COMMAND = "REDIS_KEY_RESEND_COMMAND";
 
    public static final String REDIS_KEY_TH_QUEEN = "REDIS_KEY_TH_QUEEN";
 
    public static final int REDIS_KEY_TIME = 4 * 60;
 
    @Autowired
    private RedisUtil redisUtil;
 
    public String buildKey(CommandTask data) {
        return buildKey(data.getCompanyId(), data.getIp(), data.getPort(),
                data.getResultType());
    }
 
    public String buildKey(String companyId, String ip, int port,
            String resultType) {
        String key = ip + "." + port + ":" + resultType;
        return companyId + ":" + REDIS_KEY_RESEND_COMMAND + ":" + key;
    }
 
    public void reSendTask(CommandTask data) {
        // 缓存
        redisUtil.set(buildKey(data), data, REDIS_KEY_TIME);
 
        // 创建子任务
        FutureTask<String> futureTask = new FutureTask<>(new ReSendCommonTask(data, redisUtil, buildKey(data)));
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.submit(futureTask);
        executorService.shutdown();
    }
 
    // 温湿度命令不使用子任务
    public void reSendThTask(CommandTask data) {
        // 缓存
        redisUtil.set(buildKey(data), data, REDIS_KEY_TIME);
    }
 
    public void reSendGrainTask(CommandTask data) {
        // 缓存
        redisUtil.set(buildKey(data), data, REDIS_KEY_TIME);
 
        // 创建子任务
        FutureTask<String> futureTask = new FutureTask<>(new ReSendGrainTask(
                data, redisUtil, buildKey(data)));
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.submit(futureTask);
        executorService.shutdown();
    }
 
    public void cleanKey(String companyId, String ip, int port,
            String resultType) {
 
        String key = buildKey(companyId, ip, port, resultType);
        redisUtil.del(key);
    }
 
    public void destoryAndDelCache(String companyId, String ip, Integer port,
            String messageType) {
        try {
            // 粮情直接使用最总的状态返回
            if (messageType.equals(ServerUtils.MSG_TYPE_1115)) {
                messageType = ServerUtils.MSG_TYPE_8817;
            }
            this.cleanKey(companyId, ip, port, messageType);
 
            //间隔5S踢出,避免快速直接连接
            Thread.sleep(5 * 1000);
            
            super.destory(ip, port);
 
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
 
    public void reSend(String companyId, String ip, int port, String resultType) {
        String key = buildKey(companyId, ip, port, resultType);
        CommandTask commandData = (CommandTask) redisUtil.get(key);
        if (null != commandData) {
            super.send(ip, port, commandData.getByteCommand());
        } else {
            log.error("命令重发失败:{}-{}-{}没有获取到命令。", ip, port, resultType);
        }
    }
 
    public CommandTask getRedisCommand(String companyId, String ip,
            Integer port, String resultType) {
        String key = this.buildKey(companyId, ip, port, resultType);
        return (CommandTask) redisUtil.get(key);
    }
 
    /**
     * 当前分机相同粮情分机的等待队列
     *
     * @param thRequest
     * @param request
     */
    public void addToThQueen(CheckThRequest thRequest, CheckGrainRequest request) {
        String key = thRequest.getCompanyId() + ":" + REDIS_KEY_TH_QUEEN + ":"
                + thRequest.getSerId();
 
        List<CheckGrainRequest> list = this.getThQueen(
                thRequest.getCompanyId(), thRequest.getSerId());
        if (null == list) {
            list = new ArrayList<>();
        }
 
        list.add(request);
 
        redisUtil.set(key, list, 60);
    }
 
    @SuppressWarnings("unchecked")
    public List<CheckGrainRequest> getThQueen(String companyId, String serId) {
        String key = companyId + ":" + REDIS_KEY_TH_QUEEN + ":" + serId;
        return (List<CheckGrainRequest>) redisUtil.get(key);
    }
 
}