Ejemplo n.º 1
0
        public static void HandleMessage(TransportMessage message, IBodyStorage bodyStorage, ISendMessages sender) //Public for testing
        {
            message.Headers.Remove("ServiceControl.Retry.StagingId");

            string attemptMessageId;

            if (message.Headers.TryGetValue("ServiceControl.Retry.Attempt.MessageId", out attemptMessageId))
            {
                Stream stream;
                if (bodyStorage.TryFetch(attemptMessageId, out stream))
                {
                    using (stream)
                    {
                        message.Body = ReadFully(stream);
                    }
                }
                message.Headers.Remove("ServiceControl.Retry.Attempt.MessageId");
            }
            var destination = message.Headers["ServiceControl.TargetEndpointAddress"];

            try
            {
                string retryTo;
                if (!message.Headers.TryGetValue("ServiceControl.RetryTo", out retryTo))
                {
                    retryTo = destination;
                    message.Headers.Remove("ServiceControl.TargetEndpointAddress");
                }

                sender.Send(message, new SendOptions(retryTo));
            }
            catch (Exception)
            {
                message.Headers["ServiceControl.TargetEndpointAddress"] = destination;
                if (attemptMessageId != null)
                {
                    message.Headers["ServiceControl.Retry.Attempt.MessageId"] = attemptMessageId;
                }

                throw;
            }
        }
        public static void HandleMessage(TransportMessage message, IBodyStorage bodyStorage, ISendMessages sender) //Public for testing
        {
            message.Headers.Remove("ServiceControl.Retry.StagingId");

            Log.DebugFormat("{0}: Retrieving message body", message.Id);

            string attemptMessageId;

            if (message.Headers.TryGetValue("ServiceControl.Retry.Attempt.MessageId", out attemptMessageId))
            {
                Stream stream;
                if (bodyStorage.TryFetch(attemptMessageId, out stream))
                {
                    using (stream)
                    {
                        message.Body = ReadFully(stream);
                    }
                }
                else
                {
                    Log.WarnFormat("{0}: Message Body not found for attempt Id {1}", message.Id, attemptMessageId);
                }
                message.Headers.Remove("ServiceControl.Retry.Attempt.MessageId");
            }
            else
            {
                Log.WarnFormat("{0}: Can't find message body. Missing header ServiceControl.Retry.Attempt.MessageId", message.Id);
            }

            if (message.Body != null)
            {
                Log.DebugFormat("{0}: Body size: {1} bytes", message.Id, message.Body.LongLength);
            }
            else
            {
                Log.DebugFormat("{0}: Body is NULL", message.Id);
            }

            var destination = message.Headers["ServiceControl.TargetEndpointAddress"];

            Log.DebugFormat("{0}: Forwarding message to {1}", message.Id, destination);
            try
            {
                string retryTo;
                if (!message.Headers.TryGetValue("ServiceControl.RetryTo", out retryTo))
                {
                    retryTo = destination;
                    message.Headers.Remove("ServiceControl.TargetEndpointAddress");
                }
                else
                {
                    Log.DebugFormat("{0}: Found ServiceControl.RetryTo header. Rerouting to {1}", message.Id, retryTo);
                }

                sender.Send(message, new SendOptions(retryTo));
                Log.DebugFormat("{0}: Forwarded message to {1}", message.Id, retryTo);
            }
            catch (Exception)
            {
                Log.WarnFormat("{0}: Error forwarding message, resetting headers", message.Id);
                message.Headers["ServiceControl.TargetEndpointAddress"] = destination;
                if (attemptMessageId != null)
                {
                    message.Headers["ServiceControl.Retry.Attempt.MessageId"] = attemptMessageId;
                }

                throw;
            }
        }