bool TerminateIfForwardingQueueNotWritable()
 {
     try
     {
         //Send a message to test the forwarding queue
         var testMessage = new TransportMessage(Guid.Empty.ToString("N"), new Dictionary <string, string>());
         Forwarder.Send(testMessage, Settings.ErrorLogQueue);
         return(false);
     }
     catch (Exception messageForwardingException)
     {
         //This call to RaiseCriticalError has to be on a seperate thread  otherwise it deadlocks and doesn't stop correctly.
         ThreadPool.QueueUserWorkItem(state => Configure.Instance.RaiseCriticalError("Error Import cannot start", messageForwardingException));
         return(true);
     }
 }
        public void Handle(PerformRetry message)
        {
            var failedMessage = Session.Load <FailedMessage>(new Guid(message.FailedMessageId));

            if (failedMessage == null)
            {
                throw new ArgumentException("Can't find the failed message with id: " + message.FailedMessageId);
            }

            if (failedMessage.Status != FailedMessageStatus.Unresolved)
            {
                // We only retry messages that are unresolved
                return;
            }

            var attempt = failedMessage.ProcessingAttempts.Last();

            var originalHeaders = attempt.Headers;

            var headersToRetryWith = originalHeaders.Where(kv => !KeysToRemoveWhenRetryingAMessage.Contains(kv.Key))
                                     .ToDictionary(kv => kv.Key, kv => kv.Value);

            headersToRetryWith["ServiceControl.RetryId"] = message.RetryId.ToString();

            using (var stream = BodyStorage.Fetch(attempt.MessageId))
            {
                var transportMessage = new TransportMessage(failedMessage.Id, headersToRetryWith)
                {
                    Body          = ReadFully(stream),
                    CorrelationId = attempt.CorrelationId,
                    Recoverable   = attempt.Recoverable,
                    MessageIntent = attempt.MessageIntent,
                };

                if (!String.IsNullOrWhiteSpace(attempt.ReplyToAddress))
                {
                    transportMessage.ReplyToAddress = Address.Parse(attempt.ReplyToAddress);
                }

                failedMessage.Status = FailedMessageStatus.RetryIssued;

                Forwarder.Send(transportMessage, message.TargetEndpointAddress);
            }

            Bus.Publish <MessageSubmittedForRetry>(m => m.FailedMessageId = message.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);
        }
Exemple #4
0
        void InnerHandle(TransportMessage message)
        {
            var receivedMessage = new ImportSuccessfullyProcessedMessage(message);

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

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

                var logicalMessage = LogicalMessageFactory.Create(typeof(ImportSuccessfullyProcessedMessage),
                                                                  receivedMessage);

                PipelineExecutor.InvokeLogicalMessagePipeline(logicalMessage);
            }

            if (Settings.ForwardAuditMessages == true)
            {
                Forwarder.Send(message, Settings.AuditLogQueue);
            }
        }