示例#1
0
        /// <summary>
        /// Process a collection of queue messages.
        /// </summary>
        /// <param name="messages">collection of the queue messages</param>
        private void ProcessMessages(IEnumerable <CloudQueueMessage> messages)
        {
            SessionBase.TraceSource.TraceInformation(
                SoaHelper.CreateTraceMessage(
                    "Proxy",
                    "ProcessMessages",
                    string.Format("Process {0} messages.", messages.Count <CloudQueueMessage>())));

            messages.AsParallel <CloudQueueMessage>().ForAll <CloudQueueMessage>(
                (responseQueueMessage) =>
            {
                Message response = null;

                try
                {
                    SessionBase.TraceSource.TraceInformation(
                        string.Format("SOA broker proxy perf1 - {0}", DateTime.UtcNow.TimeOfDay.TotalSeconds));

                    response = this.responseStorageClient.GetWcfMessageFromQueueMessage(responseQueueMessage);

                    var qkey = Tuple.Create(SoaHelper.GetClientDataHeaderFromMessage(response));

                    if (!this.responseMessageQueues.ContainsKey(qkey))
                    {
                        lock (this.responseMessageQueues)
                        {
                            if (!this.responseMessageQueues.ContainsKey(qkey))
                            {
                                this.responseMessageQueues.Add(qkey, new ConcurrentQueue <Message>());
                            }
                        }
                    }

                    this.responseMessageQueues[qkey].Enqueue(response);

                    UniqueId messageId = SoaHelper.GetMessageId(response);

                    SessionBase.TraceSource.TraceInformation(
                        SoaHelper.CreateTraceMessage(
                            "Proxy",
                            "Response received inqueue",
                            string.Empty,
                            messageId,
                            "Response message in queue"));

                    // do not delete the message from the queue here, depends on the long invisable timeout and hourly cleanup
                    // this.responseStorageClient.DeleteMessageAsync(responseQueueMessage, messageId);
                }
                catch (Exception e)
                {
                    SessionBase.TraceSource.TraceInformation(
                        SoaHelper.CreateTraceMessage(
                            "Proxy", "ProcessMessages", string.Format("Error occurs {0}", e)));
                }
            });

            this.semaphoreForWorker.Release();
        }