|
|
@ -86,6 +86,8 @@ public final class EdgeGrpcSession implements Closeable { |
|
|
|
|
|
|
|
|
private static final ReentrantLock downlinkMsgLock = new ReentrantLock(); |
|
|
private static final ReentrantLock downlinkMsgLock = new ReentrantLock(); |
|
|
|
|
|
|
|
|
|
|
|
private static final int MAX_DOWNLINK_ATTEMPTS = 10; // max number of attemps to send downlink message if edge connected
|
|
|
|
|
|
|
|
|
private static final String QUEUE_START_TS_ATTR_KEY = "queueStartTs"; |
|
|
private static final String QUEUE_START_TS_ATTR_KEY = "queueStartTs"; |
|
|
|
|
|
|
|
|
private final UUID sessionId; |
|
|
private final UUID sessionId; |
|
|
@ -252,9 +254,9 @@ public final class EdgeGrpcSession implements Closeable { |
|
|
try { |
|
|
try { |
|
|
if (msg.getSuccess()) { |
|
|
if (msg.getSuccess()) { |
|
|
sessionState.getPendingMsgsMap().remove(msg.getDownlinkMsgId()); |
|
|
sessionState.getPendingMsgsMap().remove(msg.getDownlinkMsgId()); |
|
|
log.debug("[{}] Msg has been processed successfully! {}", edge.getRoutingKey(), msg); |
|
|
log.debug("[{}] Msg has been processed successfully!Msd Id: [{}], Msg: {}", edge.getRoutingKey(), msg.getDownlinkMsgId(), msg); |
|
|
} else { |
|
|
} else { |
|
|
log.error("[{}] Msg processing failed! Error msg: {}", edge.getRoutingKey(), msg.getErrorMsg()); |
|
|
log.error("[{}] Msg processing failed! Msd Id: [{}], Error msg: {}", edge.getRoutingKey(), msg.getDownlinkMsgId(), msg.getErrorMsg()); |
|
|
} |
|
|
} |
|
|
if (sessionState.getPendingMsgsMap().isEmpty()) { |
|
|
if (sessionState.getPendingMsgsMap().isEmpty()) { |
|
|
log.debug("[{}] Pending msgs map is empty. Stopping current iteration", edge.getRoutingKey()); |
|
|
log.debug("[{}] Pending msgs map is empty. Stopping current iteration", edge.getRoutingKey()); |
|
|
@ -392,17 +394,17 @@ public final class EdgeGrpcSession implements Closeable { |
|
|
sessionState.setSendDownlinkMsgsFuture(SettableFuture.create()); |
|
|
sessionState.setSendDownlinkMsgsFuture(SettableFuture.create()); |
|
|
sessionState.getPendingMsgsMap().clear(); |
|
|
sessionState.getPendingMsgsMap().clear(); |
|
|
downlinkMsgsPack.forEach(msg -> sessionState.getPendingMsgsMap().put(msg.getDownlinkMsgId(), msg)); |
|
|
downlinkMsgsPack.forEach(msg -> sessionState.getPendingMsgsMap().put(msg.getDownlinkMsgId(), msg)); |
|
|
scheduleDownlinkMsgsPackSend(true); |
|
|
scheduleDownlinkMsgsPackSend(1); |
|
|
return sessionState.getSendDownlinkMsgsFuture(); |
|
|
return sessionState.getSendDownlinkMsgsFuture(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void scheduleDownlinkMsgsPackSend(boolean firstRun) { |
|
|
private void scheduleDownlinkMsgsPackSend(int attempt) { |
|
|
Runnable sendDownlinkMsgsTask = () -> { |
|
|
Runnable sendDownlinkMsgsTask = () -> { |
|
|
try { |
|
|
try { |
|
|
if (isConnected() && sessionState.getPendingMsgsMap().values().size() > 0) { |
|
|
if (isConnected() && sessionState.getPendingMsgsMap().values().size() > 0) { |
|
|
List<DownlinkMsg> copy = new ArrayList<>(sessionState.getPendingMsgsMap().values()); |
|
|
List<DownlinkMsg> copy = new ArrayList<>(sessionState.getPendingMsgsMap().values()); |
|
|
if (!firstRun) { |
|
|
if (attempt > 1) { |
|
|
log.warn("[{}] Failed to deliver the batch: {}", this.sessionId, copy); |
|
|
log.warn("[{}] Failed to deliver the batch: {}, attempt: {}", this.sessionId, copy, attempt); |
|
|
} |
|
|
} |
|
|
log.trace("[{}] [{}] downlink msg(s) are going to be send.", this.sessionId, copy.size()); |
|
|
log.trace("[{}] [{}] downlink msg(s) are going to be send.", this.sessionId, copy.size()); |
|
|
for (DownlinkMsg downlinkMsg : copy) { |
|
|
for (DownlinkMsg downlinkMsg : copy) { |
|
|
@ -410,7 +412,13 @@ public final class EdgeGrpcSession implements Closeable { |
|
|
.setDownlinkMsg(downlinkMsg) |
|
|
.setDownlinkMsg(downlinkMsg) |
|
|
.build()); |
|
|
.build()); |
|
|
} |
|
|
} |
|
|
scheduleDownlinkMsgsPackSend(false); |
|
|
if (attempt < MAX_DOWNLINK_ATTEMPTS) { |
|
|
|
|
|
scheduleDownlinkMsgsPackSend(attempt + 1); |
|
|
|
|
|
} else { |
|
|
|
|
|
log.warn("[{}] Failed to deliver the batch after {} attempts. Next messages are going to be discarded {}", |
|
|
|
|
|
this.sessionId, MAX_DOWNLINK_ATTEMPTS, copy); |
|
|
|
|
|
sessionState.getSendDownlinkMsgsFuture().set(null); |
|
|
|
|
|
} |
|
|
} else { |
|
|
} else { |
|
|
sessionState.getSendDownlinkMsgsFuture().set(null); |
|
|
sessionState.getSendDownlinkMsgsFuture().set(null); |
|
|
} |
|
|
} |
|
|
@ -419,7 +427,7 @@ public final class EdgeGrpcSession implements Closeable { |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
if (firstRun) { |
|
|
if (attempt == 1) { |
|
|
sendDownlinkExecutorService.submit(sendDownlinkMsgsTask); |
|
|
sendDownlinkExecutorService.submit(sendDownlinkMsgsTask); |
|
|
} else { |
|
|
} else { |
|
|
sessionState.setScheduledSendDownlinkTask( |
|
|
sessionState.setScheduledSendDownlinkTask( |
|
|
|