mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-20 19:15:35 +08:00
系统过滤重复的请求
This commit is contained in:
@@ -8,7 +8,6 @@ import org.springframework.data.redis.core.*;
|
|||||||
import org.springframework.data.redis.serializer.RedisSerializer;
|
import org.springframework.data.redis.serializer.RedisSerializer;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@@ -354,22 +353,33 @@ public class RedisCache {
|
|||||||
*
|
*
|
||||||
* @param pattern 表达式,如:abc*,找出所有以abc开始的键
|
* @param pattern 表达式,如:abc*,找出所有以abc开始的键
|
||||||
*/
|
*/
|
||||||
public Set<String> scan(String pattern) {
|
// public Set<String> scan(String pattern) {
|
||||||
return (Set<String>) redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
|
// return (Set<String>) redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
|
||||||
Set<String> keysTmp = new HashSet<>();
|
// Set<String> keysTmp = new HashSet<>();
|
||||||
try (Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder()
|
// try (Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder()
|
||||||
.match(pattern)
|
// .match(pattern)
|
||||||
.count(10000).build())) {
|
// .count(10000).build())) {
|
||||||
|
//
|
||||||
|
// while (cursor.hasNext()) {
|
||||||
|
// keysTmp.add(new String(cursor.next(), StandardCharsets.UTF_8));
|
||||||
|
// }
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// logger.error(e.getMessage(), e);
|
||||||
|
// throw new RuntimeException(e);
|
||||||
|
// }
|
||||||
|
// return keysTmp;
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
while (cursor.hasNext()) {
|
/**
|
||||||
keysTmp.add(new String(cursor.next(), StandardCharsets.UTF_8));
|
* setnx
|
||||||
}
|
* @param key 键
|
||||||
} catch (Exception e) {
|
* @param value 值
|
||||||
logger.error(e.getMessage(), e);
|
* @param expireTime 过期时间,单位秒
|
||||||
throw new RuntimeException(e);
|
* @return
|
||||||
}
|
*/
|
||||||
return keysTmp;
|
public Boolean setnx(String key, String value, long expireTime) {
|
||||||
});
|
return redisTemplate.opsForValue().setIfAbsent(key, value, expireTime, TimeUnit.SECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -385,7 +395,7 @@ public class RedisCache {
|
|||||||
//在一定时间内获取锁,超时则返回错误
|
//在一定时间内获取锁,超时则返回错误
|
||||||
for (; ; ) {
|
for (; ; ) {
|
||||||
//Set命令返回OK,则证明获取锁成功
|
//Set命令返回OK,则证明获取锁成功
|
||||||
Boolean ret = redisTemplate.opsForValue().setIfAbsent(lockKey, requestId, expireTime, TimeUnit.SECONDS);
|
Boolean ret = setnx(lockKey, requestId, expireTime);
|
||||||
if (ret != null && ret) {
|
if (ret != null && ret) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,4 +74,19 @@ public abstract class AbstractHandler implements InitializingBean {
|
|||||||
PileChannelEntity.checkChannel(pileSn, channel);
|
PileChannelEntity.checkChannel(pileSn, channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 阻止重复帧
|
||||||
|
*/
|
||||||
|
protected boolean verifyTheDuplicateRequest(YKCDataProtocol ykcDataProtocol, Channel channel) {
|
||||||
|
// 获取序列号域
|
||||||
|
int serialNumber = BytesUtil.bytesToIntLittle(ykcDataProtocol.getSerialNumber());
|
||||||
|
// 获取channelId
|
||||||
|
String channelId = channel.id().asShortText();
|
||||||
|
|
||||||
|
String redisKey = "Request_" + channelId + "_" + serialNumber;
|
||||||
|
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -7,7 +7,6 @@ import com.jsowell.common.constant.Constants;
|
|||||||
import com.jsowell.common.core.domain.ykc.LoginRequestData;
|
import com.jsowell.common.core.domain.ykc.LoginRequestData;
|
||||||
import com.jsowell.common.core.domain.ykc.YKCDataProtocol;
|
import com.jsowell.common.core.domain.ykc.YKCDataProtocol;
|
||||||
import com.jsowell.common.core.domain.ykc.YKCFrameTypeCode;
|
import com.jsowell.common.core.domain.ykc.YKCFrameTypeCode;
|
||||||
import com.jsowell.common.core.redis.RedisCache;
|
|
||||||
import com.jsowell.common.util.BytesUtil;
|
import com.jsowell.common.util.BytesUtil;
|
||||||
import com.jsowell.common.util.StringUtils;
|
import com.jsowell.common.util.StringUtils;
|
||||||
import com.jsowell.common.util.YKCUtils;
|
import com.jsowell.common.util.YKCUtils;
|
||||||
@@ -30,6 +29,7 @@ import java.util.concurrent.CompletableFuture;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
public class LoginRequestHandler extends AbstractHandler {
|
public class LoginRequestHandler extends AbstractHandler {
|
||||||
|
private final String type = YKCUtils.frameType2Str(YKCFrameTypeCode.LOGIN_CODE.getBytes());
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IPileBasicInfoService pileBasicInfoService;
|
private IPileBasicInfoService pileBasicInfoService;
|
||||||
@@ -40,11 +40,6 @@ public class LoginRequestHandler extends AbstractHandler {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IPileMsgRecordService pileMsgRecordService;
|
private IPileMsgRecordService pileMsgRecordService;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RedisCache redisCache;
|
|
||||||
|
|
||||||
private final String type = YKCUtils.frameType2Str(YKCFrameTypeCode.LOGIN_CODE.getBytes());
|
|
||||||
|
|
||||||
private List<String> newProgramVersionList = Lists.newArrayList("c6-30");
|
private List<String> newProgramVersionList = Lists.newArrayList("c6-30");
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -111,7 +106,6 @@ public class LoginRequestHandler extends AbstractHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] supplyProcess(YKCDataProtocol ykcDataProtocol, Channel channel) {
|
public byte[] supplyProcess(YKCDataProtocol ykcDataProtocol, Channel channel) {
|
||||||
// log.info("[===执行登录逻辑===] param:{}, channel:{}", JSONObject.toJSONString(ykcDataProtocol), channel.toString());
|
|
||||||
// 获取消息体
|
// 获取消息体
|
||||||
byte[] msgBody = ykcDataProtocol.getMsgBody();
|
byte[] msgBody = ykcDataProtocol.getMsgBody();
|
||||||
|
|
||||||
@@ -121,7 +115,6 @@ public class LoginRequestHandler extends AbstractHandler {
|
|||||||
// 桩编码
|
// 桩编码
|
||||||
byte[] pileSnByte = BytesUtil.copyBytes(msgBody, startIndex, length);
|
byte[] pileSnByte = BytesUtil.copyBytes(msgBody, startIndex, length);
|
||||||
String pileSn = BytesUtil.binary(pileSnByte, 16);
|
String pileSn = BytesUtil.binary(pileSnByte, 16);
|
||||||
// log.info("桩号:{}", pileSn);
|
|
||||||
|
|
||||||
// 保存时间
|
// 保存时间
|
||||||
saveLastTimeAndCheckChannel(pileSn, channel);
|
saveLastTimeAndCheckChannel(pileSn, channel);
|
||||||
@@ -140,7 +133,6 @@ public class LoginRequestHandler extends AbstractHandler {
|
|||||||
// 通信协议版本 版本号乘 10,v1.0 表示 0x0A
|
// 通信协议版本 版本号乘 10,v1.0 表示 0x0A
|
||||||
startIndex += length;
|
startIndex += length;
|
||||||
byte[] communicationVersionByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
|
byte[] communicationVersionByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
|
||||||
// int i = Integer.parseInt(BytesUtil.bcd2Str(communicationVersionByteArr)); // 0F --> 15
|
|
||||||
BigDecimal bigDecimal = new BigDecimal(BytesUtil.bcd2Str(communicationVersionByteArr));
|
BigDecimal bigDecimal = new BigDecimal(BytesUtil.bcd2Str(communicationVersionByteArr));
|
||||||
BigDecimal communicationVersionTemp = bigDecimal.divide(new BigDecimal(10));
|
BigDecimal communicationVersionTemp = bigDecimal.divide(new BigDecimal(10));
|
||||||
String communicationVersion = "v" + communicationVersionTemp;
|
String communicationVersion = "v" + communicationVersionTemp;
|
||||||
@@ -170,6 +162,10 @@ public class LoginRequestHandler extends AbstractHandler {
|
|||||||
byte[] businessTypeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
|
byte[] businessTypeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
|
||||||
String business = BytesUtil.bcd2Str(businessTypeByteArr);
|
String business = BytesUtil.bcd2Str(businessTypeByteArr);
|
||||||
|
|
||||||
|
// *********************** 字段解析完成,下面进行逻辑处理 *********************** //
|
||||||
|
verifyTheDuplicateRequest(ykcDataProtocol, channel);
|
||||||
|
|
||||||
|
|
||||||
LoginRequestData loginRequestData = LoginRequestData.builder()
|
LoginRequestData loginRequestData = LoginRequestData.builder()
|
||||||
.pileSn(pileSn)
|
.pileSn(pileSn)
|
||||||
.pileType(pileType)
|
.pileType(pileType)
|
||||||
|
|||||||
Reference in New Issue
Block a user