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