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);
|
}
|
|
}
|