Example #1
0
        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?
                        }
                    }
                }
            }
        }
Example #2
0
        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?
                    }
                }
            }
        }