예제 #1
0
        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.");
        }