|
|
|
@ -62,6 +62,36 @@ public class MessageHandler { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static class SequenceJudgement { |
|
|
|
|
|
|
|
private boolean valid; |
|
|
|
private boolean duplicate ; |
|
|
|
|
|
|
|
public boolean isValid() { |
|
|
|
return valid; |
|
|
|
} |
|
|
|
public void setValid(boolean valid) { |
|
|
|
this.valid = valid; |
|
|
|
} |
|
|
|
|
|
|
|
public boolean isDuplicate() { |
|
|
|
return duplicate; |
|
|
|
} |
|
|
|
public void setDuplicate(boolean duplicate) { |
|
|
|
this.duplicate = duplicate; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String toString() { |
|
|
|
return "Message{" + |
|
|
|
"valid='" + valid + '\'' + |
|
|
|
", duplicate='" + duplicate + '\'' + |
|
|
|
'}'; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 构造函数 |
|
|
|
* @param config 配置信息 |
|
|
|
@ -152,11 +182,7 @@ public class MessageHandler { |
|
|
|
public String handleSystemStartMessage(Message message, String clientId) { |
|
|
|
logger.info("客户端[{}]发送系统开始指示,序列号: {}", clientId, message.getSequence()); |
|
|
|
|
|
|
|
// 验证并更新序列号
|
|
|
|
if (!isValidSequence(clientId, message.getSequence())) { |
|
|
|
logger.warn("客户端[{}]系统开始消息序列号无效: {}", clientId, message.getSequence()); |
|
|
|
return createErrorMessage(message.getSequence()); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 创建成功响应
|
|
|
|
return formatResponse(message.getSequence(), config.getResponseOk(), null); |
|
|
|
@ -173,11 +199,6 @@ public class MessageHandler { |
|
|
|
clientId, message.getSequence(), |
|
|
|
message.getData() != null ? message.getData().length() : 0); |
|
|
|
|
|
|
|
// 验证序列号
|
|
|
|
if (!isValidSequence(clientId, message.getSequence())) { |
|
|
|
logger.warn("客户端[{}]正常数据消息序列号无效: {}", clientId, message.getSequence()); |
|
|
|
return createErrorMessage(message.getSequence()); |
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
|
// 这里可以添加实际的数据处理逻辑
|
|
|
|
@ -202,12 +223,6 @@ public class MessageHandler { |
|
|
|
clientId, message.getSequence(), |
|
|
|
message.getData() != null ? message.getData().length() : 0); |
|
|
|
|
|
|
|
// 验证序列号
|
|
|
|
if (!isValidSequence(clientId, message.getSequence())) { |
|
|
|
logger.warn("客户端[{}]未发送数据消息序列号无效: {}", clientId, message.getSequence()); |
|
|
|
return createErrorMessage(message.getSequence()); |
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
|
// 处理未发送数据(通常需要特殊处理以避免重复处理)
|
|
|
|
// 例如:检查数据是否已经存在,如果不存在则处理,否则直接返回成功
|
|
|
|
@ -264,9 +279,13 @@ public class MessageHandler { |
|
|
|
* @param sequence 序列号 |
|
|
|
* @return 是否有效 |
|
|
|
*/ |
|
|
|
public boolean isValidSequence(String clientId, String sequence) { |
|
|
|
public SequenceJudgement isValidSequence(String clientId, String sequence) { |
|
|
|
sequenceLock.lock(); |
|
|
|
try { |
|
|
|
SequenceJudgement sequenceJudgement = new SequenceJudgement(); |
|
|
|
sequenceJudgement.setValid(true); |
|
|
|
sequenceJudgement.setDuplicate(false); |
|
|
|
|
|
|
|
// 获取该客户端上次收到的序列号
|
|
|
|
String lastSeq = lastReceivedSequence.get(clientId); |
|
|
|
|
|
|
|
@ -275,7 +294,7 @@ public class MessageHandler { |
|
|
|
lastReceivedSequence.put(clientId, sequence); |
|
|
|
// 重置重复计数
|
|
|
|
duplicateSequenceCount.put(clientId, 0); |
|
|
|
return true; |
|
|
|
return sequenceJudgement; |
|
|
|
} |
|
|
|
|
|
|
|
// 检查是否是重复序列号
|
|
|
|
@ -290,12 +309,15 @@ public class MessageHandler { |
|
|
|
if (count >= 6) { |
|
|
|
logger.error("客户端[{}]连续6次发送相同序列号: {}, 判定为通信异常", clientId, sequence); |
|
|
|
// 返回false表示通信异常,应该停止响应
|
|
|
|
return false; |
|
|
|
sequenceJudgement.setDuplicate(true); |
|
|
|
sequenceJudgement.setValid(false); |
|
|
|
return sequenceJudgement; |
|
|
|
} |
|
|
|
|
|
|
|
// 返回true表示是重复数据,但不是通信异常
|
|
|
|
// 调用方会处理这种情况:不处理数据但返回肯定响应
|
|
|
|
return true; |
|
|
|
sequenceJudgement.setDuplicate(true); |
|
|
|
return sequenceJudgement; |
|
|
|
} |
|
|
|
|
|
|
|
// 检查序列号是否有效(递增或循环)
|
|
|
|
@ -307,8 +329,9 @@ public class MessageHandler { |
|
|
|
// 重置重复计数
|
|
|
|
duplicateSequenceCount.put(clientId, 0); |
|
|
|
} |
|
|
|
sequenceJudgement.setValid(isValid); |
|
|
|
|
|
|
|
return isValid; |
|
|
|
return sequenceJudgement; |
|
|
|
} finally { |
|
|
|
sequenceLock.unlock(); |
|
|
|
} |
|
|
|
|