private async Task PublishMessage(IEnumerable <Tuple <IMqttSession, QoS> > subscriptions, String topic, byte[] payload) { String messageId = null; //Used to for non QoS 0 messages, to store message for sending. PublishMessage message = null; //Used for QoS 0 messages, to send the message. Can reuse since there is no message identifier. foreach (Tuple <IMqttSession, QoS> subscription in subscriptions) { //Persist a reference and queue if QoS > 0 if (subscription.Item2 != QoS.BestEffort) { //Save the message if we haven't already. if (messageId == null) { messageId = await storageProvider.StoreMessage(new InFlightMessage(topic, payload)); } else { await storageProvider.ReferenceMessage(messageId); } subscription.Item1.Publish(messageId, subscription.Item2); } else { TcpClient subscriber; //Non-Clean subscribers won't have a TcpConnection. Currently we drop messages to QoS 0 subscriptions on non-clean connection. if (connections.TryGetValue(subscription.Item1, out subscriber)) { if (message == null) { message = new PublishMessage(false, false, QoS.BestEffort, topic, payload, null); } try { await message.Write(subscriber.GetStream()); } catch (Exception) { //Close socket? } } } } }
private void PublishMessage(IEnumerable <Tuple <IMqttSession, MqttQos> > subscriptions, String topic, byte[] payload) { String messageId = null; //Used to for non QoS 0 messages, to store message for sending. MqttPublishMessage message = null; //Used for QoS 0 messages, to send the message. Can reuse since there is no message identifier. foreach (Tuple <IMqttSession, MqttQos> subscription in subscriptions) { //Persist a reference and queue if QoS > 0 if (subscription.Item2 != MqttQos.BestEffort) { //Save the message if we haven't already. if (messageId == null) { messageId = storageProvider.StoreMessage(new InFlightMessage(topic, payload)); } else { storageProvider.ReferenceMessage(messageId); } subscription.Item1.Publish(messageId, subscription.Item2); } else { if (message == null) { message = new MqttPublishMessage().WithQos(MqttQos.AtMostOnce); } try { subscription.Item1.Write(message); } catch (Exception) { //Close socket? } } } }