fixed missing ACK when message publishing fails
This commit is contained in:
		
							parent
							
								
									81ce59db1e
								
							
						
					
					
						commit
						f9b52c3a43
					
				@ -412,7 +412,7 @@ public abstract class AbstractGatewaySessionHandler<T extends AbstractGatewayDev
 | 
			
		||||
            }
 | 
			
		||||
            String deviceName = deviceEntry.getKey();
 | 
			
		||||
            process(deviceName, deviceCtx -> processPostTelemetryMsg(deviceCtx, deviceEntry.getValue(), deviceName, msgId),
 | 
			
		||||
                    t -> failedToProcessLog(deviceName, TELEMETRY, t));
 | 
			
		||||
                    t -> processFailure(msgId, deviceName, TELEMETRY, t));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -444,7 +444,7 @@ public abstract class AbstractGatewaySessionHandler<T extends AbstractGatewayDev
 | 
			
		||||
            deviceMsgList.forEach(telemetryMsg -> {
 | 
			
		||||
                String deviceName = checkDeviceName(telemetryMsg.getDeviceName());
 | 
			
		||||
                process(deviceName, deviceCtx -> processPostTelemetryMsg(deviceCtx, telemetryMsg.getMsg(), deviceName, msgId),
 | 
			
		||||
                        t -> failedToProcessLog(deviceName, TELEMETRY, t));
 | 
			
		||||
                        t -> processFailure(msgId, deviceName, TELEMETRY, t));
 | 
			
		||||
            });
 | 
			
		||||
        } catch (RuntimeException | InvalidProtocolBufferException e) {
 | 
			
		||||
            throw new AdaptorException(e);
 | 
			
		||||
@ -483,7 +483,7 @@ public abstract class AbstractGatewaySessionHandler<T extends AbstractGatewayDev
 | 
			
		||||
 | 
			
		||||
            String deviceName = deviceEntry.getKey();
 | 
			
		||||
            process(deviceName, deviceCtx -> processClaimDeviceMsg(deviceCtx, deviceEntry.getValue(), deviceName, msgId),
 | 
			
		||||
                    t -> failedToProcessLog(deviceName, CLAIMING, t));
 | 
			
		||||
                    t -> processFailure(msgId, deviceName, CLAIMING, t));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -510,7 +510,7 @@ public abstract class AbstractGatewaySessionHandler<T extends AbstractGatewayDev
 | 
			
		||||
            claimMsgList.forEach(claimDeviceMsg -> {
 | 
			
		||||
                String deviceName = checkDeviceName(claimDeviceMsg.getDeviceName());
 | 
			
		||||
                process(deviceName, deviceCtx -> processClaimDeviceMsg(deviceCtx, claimDeviceMsg.getClaimRequest(), deviceName, msgId),
 | 
			
		||||
                        t -> failedToProcessLog(deviceName, CLAIMING, t));
 | 
			
		||||
                        t -> processFailure(msgId, deviceName, CLAIMING, t));
 | 
			
		||||
            });
 | 
			
		||||
        } catch (RuntimeException | InvalidProtocolBufferException e) {
 | 
			
		||||
            throw new AdaptorException(e);
 | 
			
		||||
@ -539,7 +539,7 @@ public abstract class AbstractGatewaySessionHandler<T extends AbstractGatewayDev
 | 
			
		||||
 | 
			
		||||
            String deviceName = deviceEntry.getKey();
 | 
			
		||||
            process(deviceName, deviceCtx -> processPostAttributesMsg(deviceCtx, deviceEntry.getValue(), deviceName, msgId),
 | 
			
		||||
                    t -> failedToProcessLog(deviceName, ATTRIBUTE, t));
 | 
			
		||||
                    t -> processFailure(msgId, deviceName, ATTRIBUTE, t));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -565,7 +565,7 @@ public abstract class AbstractGatewaySessionHandler<T extends AbstractGatewayDev
 | 
			
		||||
            attributesMsgList.forEach(attributesMsg -> {
 | 
			
		||||
                String deviceName = checkDeviceName(attributesMsg.getDeviceName());
 | 
			
		||||
                process(deviceName, deviceCtx -> processPostAttributesMsg(deviceCtx, attributesMsg.getMsg(), deviceName, msgId),
 | 
			
		||||
                        t -> failedToProcessLog(deviceName, ATTRIBUTE, t));
 | 
			
		||||
                        t -> processFailure(msgId, deviceName, ATTRIBUTE, t));
 | 
			
		||||
            });
 | 
			
		||||
        } catch (RuntimeException | InvalidProtocolBufferException e) {
 | 
			
		||||
            throw new AdaptorException(e);
 | 
			
		||||
@ -648,7 +648,7 @@ public abstract class AbstractGatewaySessionHandler<T extends AbstractGatewayDev
 | 
			
		||||
 | 
			
		||||
    private void onDeviceRpcResponse(Integer requestId, String data, String deviceName, int msgId) {
 | 
			
		||||
        process(deviceName, deviceCtx -> processRpcResponseMsg(deviceCtx, requestId, data, deviceName, msgId),
 | 
			
		||||
                t -> failedToProcessLog(deviceName, RPC_RESPONSE, t));
 | 
			
		||||
                t -> processFailure(msgId, deviceName, RPC_RESPONSE, t));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void processRpcResponseMsg(MqttDeviceAwareSessionContext deviceCtx, Integer requestId, String data, String deviceName, int msgId) {
 | 
			
		||||
@ -661,8 +661,7 @@ public abstract class AbstractGatewaySessionHandler<T extends AbstractGatewayDev
 | 
			
		||||
        int msgId = getMsgId(mqttMsg);
 | 
			
		||||
        process(deviceName, deviceCtx -> processGetAttributeRequestMessage(deviceCtx, requestMsg, deviceName, msgId),
 | 
			
		||||
                t -> {
 | 
			
		||||
                    failedToProcessLog(deviceName, ATTRIBUTES_REQUEST, t);
 | 
			
		||||
                    ack(mqttMsg, MqttReasonCodes.PubAck.IMPLEMENTATION_SPECIFIC_ERROR);
 | 
			
		||||
                    processFailure(msgId, deviceName, ATTRIBUTES_REQUEST, t, MqttReasonCodes.PubAck.IMPLEMENTATION_SPECIFIC_ERROR);
 | 
			
		||||
                });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -790,10 +789,19 @@ public abstract class AbstractGatewaySessionHandler<T extends AbstractGatewayDev
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void failedToProcessLog(String deviceName, String msgType, Throwable t) {
 | 
			
		||||
    protected void processFailure(int msgId, String deviceName, String msgType, Throwable t) {
 | 
			
		||||
        log.debug("[{}][{}][{}] Failed to process device {} command: [{}]", gateway.getTenantId(), gateway.getDeviceId(), sessionId, msgType, deviceName, t);
 | 
			
		||||
        if (DataConstants.MAXIMUM_NUMBER_OF_DEVICES_REACHED.equals(t.getMessage())) {
 | 
			
		||||
            processFailure(msgId, deviceName, msgType, t, MqttReasonCodes.PubAck.QUOTA_EXCEEDED);
 | 
			
		||||
        } else {
 | 
			
		||||
            processFailure(msgId, deviceName, msgType, t, MqttReasonCodes.PubAck.UNSPECIFIED_ERROR);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void processFailure(int msgId, String deviceName, String msgType, Throwable t, MqttReasonCodes.PubAck pubAck) {
 | 
			
		||||
        log.debug("[{}][{}][{}] Failed to process device {} command: [{}]", gateway.getTenantId(), gateway.getDeviceId(), sessionId, msgType, deviceName, t);
 | 
			
		||||
        ack(msgId, pubAck);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void closeDeviceSession(String deviceName, MqttReasonCodes.Disconnect returnCode) {
 | 
			
		||||
        try {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user