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 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 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 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 getThQueen(String companyId, String serId) { String key = companyId + ":" + REDIS_KEY_TH_QUEEN + ":" + serId; return (List) redisUtil.get(key); } }