예제 #1
0
        /// <summary>
        /// Gets and processes the next message from the queue.
        /// </summary>
        /// <param name="processMessage">Processing action.</param>
        /// <param name="onError">Error action. Should not throw an exception.</param>
        /// <returns>True if the message is processed, false if the queue is empty.</returns>
        public bool ReadNextMessage <T>(
            Action <T> processMessage,
            Action <Exception, T, CloudQueueMessage> onError
            ) where T : IGatewayMessage
        {
            Guard.NotNull(processMessage, "processMessage");

            // TODO set a thread updating invisibility timeout
            CloudQueueMessage queueMessage = _queue.GetMessage();

            if (queueMessage == null)
            {
                return(false);
            }

            T msg = default(T);

            try
            {
                msg = GatewayPacket.Unpack <T>(queueMessage.AsBytes, _gatewayBlobStore);
                processMessage(msg);
            }
            catch (Exception e)
            {
                if (onError != null)
                {
                    onError(e, msg, queueMessage);
                }
            }
            finally
            {
                _queue.DeleteMessage(queueMessage);
            }

            return(true);
        }