private void HandleQueue() { Logger.Debug("Processing queue."); while (queue.Count > 0) { IMessage item = null; lock (self) item = queue.Dequeue(); Logger.InfoFormat("Processing {0} message.", item.GetStructureName()); // Call the message handler, if available, to process the message if (messageHandler != null) { item = messageHandler.HandleMessage(item); } // Send the message to the relevant end points Dictionary <string, IEndPoint> endpoints = GetRelevantEndPoints(item); // Handle all the endpoint parallel, but keep the message queue synchronised over all // end points. Parallel.For(0, endpoints.Keys.Count, (i) => { IEndPoint endp = endpoints[endpoints.Keys.ElementAt(i)]; try { bool result = false; int tries = 0; while (!result && (tries < retryCount)) { tries++; result = endp.Send(item); if (!result) { Logger.InfoFormat("Couldn't deliver message to endpoint '{0}'. Message: {1}. Retrying after sleep.", endpoints.Keys.ElementAt(i), item.GetStructureName()); Thread.Sleep(retrySleep); } } if (!result) { Logger.ErrorFormat("Couldn't deliver message to endpoint '{0}'. Message: {1}. Stopping to try.", endpoints.Keys.ElementAt(i), item.GetStructureName()); } } catch (Exception e) { Console.Write(e.Message); } }); } Logger.Debug("Queue done."); }