示例#1
0
        private MessageDocument GetOriginalMessageIfExists(long retryId, RetryMessageResult result)
        {
            MessageDocument originalMessage;

            using (var session = documentStore.OpenSessionForDefaultTenant())
            {
                originalMessage = session.Load <MessageDocument>(retryId);
            }
            if (originalMessage == null)
            {
                result.RetryMessageItems.Add(new RetryMessageItem
                {
                    IsRetrying     = false,
                    RetryId        = retryId,
                    RetryQueue     = null,
                    AdditionalInfo = "Original message does not exist in message store"
                });
                return(null);
            }
            return(originalMessage);
        }
示例#2
0
        public RetryMessageResult Retry(RetryMessageModel retryMessageModel)
        {
            var result = new RetryMessageResult();

            foreach (var retryId in retryMessageModel.RetryIds)
            {
                var originalMessage = GetOriginalMessageIfExists(retryId, result);
                if (originalMessage == null)
                {
                    continue;
                }

                if (originalMessage.AdditionalErrorStatus != AdditionalErrorStatus.Unresolved)
                {
                    result.RetryMessageItems.Add(new RetryMessageItem
                    {
                        IsRetrying     = false,
                        RetryId        = retryId,
                        RetryQueue     = null,
                        AdditionalInfo = "Message is in an invalid state for retry",
                        AdditionalErrorStatusOfOriginalMessage = originalMessage.AdditionalErrorStatusString,
                        CanRetryOriginalMessage = originalMessage.CanRetry
                    });
                }
                else
                {
                    var rawMessage  = new RawMessage(originalMessage);
                    var destination = determineRetryDestinationService.GetRetryDestination(rawMessage,
                                                                                           retryMessageModel.UserSuppliedRetryDestination);
                    createRetryMessagesFromOriginalService.PrepareMessageForRetry(rawMessage);
                    addRetryTrackingHeadersService.AddTrackingHeaders(rawMessage, retryId);
                    IBasicProperties basicProperties = createBasicPropertiesService.Create(rawMessage);
                    var errorMessage = sendMessagesService.Send(rawMessage, destination, originalMessage.ApplicationId,
                                                                basicProperties);
                    if (errorMessage == null)
                    {
                        using (var session = documentStore.OpenSessionForDefaultTenant())
                        {
                            originalMessage.AdditionalErrorStatus = AdditionalErrorStatus.RetryPending;
                            session.Store(originalMessage);
                            session.SaveChanges();
                        }
                        result.RetryMessageItems.Add(new RetryMessageItem
                        {
                            IsRetrying     = true,
                            RetryId        = retryId,
                            RetryQueue     = destination,
                            AdditionalInfo = null,
                            AdditionalErrorStatusOfOriginalMessage = originalMessage.AdditionalErrorStatusString,
                            CanRetryOriginalMessage = originalMessage.CanRetry
                        });
                    }
                    else
                    {
                        result.RetryMessageItems.Add(new RetryMessageItem
                        {
                            IsRetrying     = false,
                            RetryId        = retryId,
                            RetryQueue     = destination,
                            AdditionalInfo = errorMessage,
                            AdditionalErrorStatusOfOriginalMessage = originalMessage.AdditionalErrorStatusString,
                            CanRetryOriginalMessage = originalMessage.CanRetry
                        });
                    }
                }
            }

            return(result);
        }