Commit 71a0f66795398ef1471d574a0baff7785325ff79

Authored by 芯火源
1 parent 08b4dec8

fix: TCP命令下发状态超时问题修复

1、同步时,命令下发后返回状态DELIVERED给演员节点
2、异步时,命令下发后返回状态SENT给演员节点
设备演员在收到的RPC状态为DELIVERED才会删除监控RPC状态的定时任务。
@@ -71,6 +71,7 @@ import java.util.Optional; @@ -71,6 +71,7 @@ import java.util.Optional;
71 import java.util.UUID; 71 import java.util.UUID;
72 import java.util.concurrent.ConcurrentHashMap; 72 import java.util.concurrent.ConcurrentHashMap;
73 import java.util.concurrent.ConcurrentMap; 73 import java.util.concurrent.ConcurrentMap;
  74 +import java.util.concurrent.TimeUnit;
74 import java.util.concurrent.atomic.AtomicInteger; 75 import java.util.concurrent.atomic.AtomicInteger;
75 import java.util.regex.Pattern; 76 import java.util.regex.Pattern;
76 77
@@ -526,11 +527,23 @@ public class TcpTransportHandler extends ChannelInboundHandlerAdapter implements @@ -526,11 +527,23 @@ public class TcpTransportHandler extends ChannelInboundHandlerAdapter implements
526 TcpTransportAdaptor adaptor = deviceSessionCtx.getPayloadAdaptor(); 527 TcpTransportAdaptor adaptor = deviceSessionCtx.getPayloadAdaptor();
527 try { 528 try {
528 adaptor.convertToPublish(deviceSessionCtx, rpcRequest).ifPresent(payload -> { 529 adaptor.convertToPublish(deviceSessionCtx, rpcRequest).ifPresent(payload -> {
529 - 530 + int msgId = rpcRequest.getRequestId();
  531 + boolean oneWay = rpcRequest.getOneway();
  532 + if (!oneWay) {
  533 + rpcAwaitingAck.put(msgId, rpcRequest);
  534 + context.getScheduler().schedule(() -> {
  535 + TransportProtos.ToDeviceRpcRequestMsg msg = rpcAwaitingAck.remove(msgId);
  536 + if (msg != null) {
  537 + transportService.process(deviceSessionCtx.getSessionInfo(), rpcRequest, RpcStatus.TIMEOUT, TransportServiceCallback.EMPTY);
  538 + }
  539 + }, Math.max(0, Math.min(deviceSessionCtx.getContext().getTimeout(), rpcRequest.getExpirationTime() - System.currentTimeMillis())), TimeUnit.MILLISECONDS);
  540 + }
530 var cf = pushDeviceMsg(deviceSessionCtx.getChannel(), payload.getDatas()); 541 var cf = pushDeviceMsg(deviceSessionCtx.getChannel(), payload.getDatas());
531 cf.addListener(result -> { 542 cf.addListener(result -> {
532 if (result.cause() == null) { 543 if (result.cause() == null) {
533 - if (rpcRequest.getPersisted()) { 544 + if (oneWay) {
  545 + transportService.process(deviceSessionCtx.getSessionInfo(), rpcRequest, RpcStatus.DELIVERED, TransportServiceCallback.EMPTY);
  546 + } else if (rpcRequest.getPersisted()) {
534 transportService.process(deviceSessionCtx.getSessionInfo(), rpcRequest, RpcStatus.SENT, TransportServiceCallback.EMPTY); 547 transportService.process(deviceSessionCtx.getSessionInfo(), rpcRequest, RpcStatus.SENT, TransportServiceCallback.EMPTY);
535 } 548 }
536 } else { 549 } else {
@@ -93,11 +93,15 @@ public class TcpGatewayDeviceSessionCtx extends TcpDeviceWareSessionContext impl @@ -93,11 +93,15 @@ public class TcpGatewayDeviceSessionCtx extends TcpDeviceWareSessionContext impl
93 try { 93 try {
94 parent.getPayloadAdaptor().convertToPublish(this, request).ifPresent( 94 parent.getPayloadAdaptor().convertToPublish(this, request).ifPresent(
95 payload -> { 95 payload -> {
  96 + boolean oneWay = request.getOneway();
96 ChannelFuture channelFuture = parent.pushDeviceMsg(payload.getDatas()); 97 ChannelFuture channelFuture = parent.pushDeviceMsg(payload.getDatas());
97 if (request.getPersisted()) { 98 if (request.getPersisted()) {
98 channelFuture.addListener(result -> { 99 channelFuture.addListener(result -> {
99 - if (result.cause() == null) { 100 + if (oneWay) {
  101 + transportService.process(getSessionInfo(), request, RpcStatus.DELIVERED, TransportServiceCallback.EMPTY);
  102 + } else if (request.getPersisted()) {
100 transportService.process(getSessionInfo(), request, RpcStatus.SENT, TransportServiceCallback.EMPTY); 103 transportService.process(getSessionInfo(), request, RpcStatus.SENT, TransportServiceCallback.EMPTY);
  104 +
101 } 105 }
102 }); 106 });
103 } 107 }