/// <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(); }