Exemplo n.º 1
0
        public void Handle(ImportFailedMessage message)
        {
            Data.FailedMessageId   = message.UniqueMessageId;
            Data.FailedMessageType = (string)message.Metadata["MessageType"];

            var timeOfFailure = message.FailureDetails.TimeOfFailure;

            if (Data.ProcessingAttempts.Any(a => a.AttemptedAt == timeOfFailure))
            {
                return;
            }

            Data.ProcessingAttempts.Add(new FailedMessagePolicyData.FailedProcessingAttempt
            {
                Id          = Guid.NewGuid(),
                AttemptedAt = timeOfFailure,
                AddressOfFailingEndpoint = Address.Parse(message.FailureDetails.AddressOfFailingEndpoint),
                FailingEndpoint          = message.FailingEndpointId
            });

            string retryId;

            if (message.PhysicalMessage.Headers.TryGetValue("ServiceControl.RetryId", out retryId))
            {
                var retryAttempt = Data.RetryAttempts.SingleOrDefault(r => r.Id == Guid.Parse(retryId));
                // If for some reason the user has deleted the RavenDB database and starting fresh and the user
                // attempts to move messages from error.log back into the error queue for ServiceControl to
                // rehydrate the error messages, in this case, we won't have a corresponding saga. Therefore
                // we are using SingleOrDefault instead of Single.
                if (retryAttempt != null)
                {
                    retryAttempt.Completed = true;
                    retryAttempt.Failed    = true;
                }
                else
                {
                    Logger.DebugFormat("This message {0} has `ServiceControl.RetryId` header, but could not find the associated data in the Saga - Possible cause, an old message from the errors.Log queue is being retried and we don't have the associated saga for it.", Data.FailedMessageId);
                }
            }

            if (Data.ProcessingAttempts.Count > 1)
            {
                Bus.Publish <MessageFailedRepeatedly>(m =>
                {
                    m.FailureDetails  = message.FailureDetails;
                    m.EndpointId      = message.FailingEndpointId;
                    m.FailedMessageId = Data.FailedMessageId;
                });
            }
            else
            {
                Bus.Publish <MessageFailed>(m =>
                {
                    m.FailureDetails  = message.FailureDetails;
                    m.EndpointId      = message.FailingEndpointId;
                    m.FailedMessageId = Data.FailedMessageId;
                });
            }
        }
Exemplo n.º 2
0
        void InnerHandle(TransportMessage message)
        {
            var errorMessageReceived = new ImportFailedMessage(message);

            var logicalMessage = LogicalMessageFactory.Create(typeof(ImportFailedMessage), errorMessageReceived);

            using (var childBuilder = Builder.CreateChildBuilder())
            {
                PipelineExecutor.CurrentContext.Set(childBuilder);

                foreach (var enricher in childBuilder.BuildAll <IEnrichImportedMessages>())
                {
                    enricher.Enrich(errorMessageReceived);
                }

                PipelineExecutor.InvokeLogicalMessagePipeline(logicalMessage);
            }

            Forwarder.Send(message, Settings.ErrorLogQueue);
        }
        void InnerHandle(TransportMessage message)
        {
            var errorMessageReceived = new ImportFailedMessage(message);

            var logicalMessage = LogicalMessageFactory.Create(typeof(ImportFailedMessage), errorMessageReceived);

            using (var childBuilder = Builder.CreateChildBuilder())
            {
                PipelineExecutor.CurrentContext.Set(childBuilder);

                foreach (var enricher in childBuilder.BuildAll<IEnrichImportedMessages>())
                {
                    enricher.Enrich(errorMessageReceived);
                }

                PipelineExecutor.InvokeLogicalMessagePipeline(logicalMessage);
            }

            Forwarder.Send(message, Settings.ErrorLogQueue);
        }