private void queueQos2Message(PublishMessage message) throws UnRetriableException { if (MqttQoS.EXACTLY_ONCE.value() == message.getQos()) { // This message needs to be retained // while handshake is completed before being released. message.setIsRelease(false); Observable<Map.Entry<Long, IotMessageKey>> messageIdObservable = getDatastore().saveMessage(message); messageIdObservable.subscribe( messageIdentity -> { // We need to push out a PUBREC PublishReceivedMessage publishReceivedMessage = PublishReceivedMessage.from(messageIdentity.getValue().getMessageId()); publishReceivedMessage.copyTransmissionData(message); pushToServer(publishReceivedMessage); }); } else throw new UnRetriableException( "Only qos 2 messages should be Queued for handshake to occur."); }