Example #1
0
        public bool HandleError(Exception exception)
        {
            var errorChannel = ResolveErrorChannel(exception);
            var sent         = false;

            if (errorChannel != null)
            {
                try
                {
                    MessagingTemplate.Send(errorChannel, ErrorMessageStrategy.BuildErrorMessage(exception, null));
                    sent = true;
                }
                catch (Exception errorDeliveryError)
                {
                    _logger?.LogWarning("Error message was not delivered.", errorDeliveryError);
                }
            }

            if (!sent)
            {
                var failedMessage = (exception is MessagingException) ? ((MessagingException)exception).FailedMessage : null;
                if (failedMessage != null)
                {
                    _logger?.LogError("failure occurred in messaging task with message: " + failedMessage, exception);
                }
                else
                {
                    _logger?.LogError("failure occurred in messaging task", exception);
                }
            }

            return(sent);
        }
Example #2
0
        protected virtual IMessage BuildReturnedMessage(IMessage message, int replyCode, string replyText, string exchange, string returnedRoutingKey, IMessageConverter converter)
        {
            var returnedObject = converter.FromMessage(message, null);
            var builder        = PrepareMessageBuilder(returnedObject);

            // TODO: Map < String, ?> headers = getHeaderMapper().toHeadersFromReply(message.getMessageProperties());
            if (ErrorMessageStrategy == null)
            {
                builder.CopyHeadersIfAbsent(message.Headers)
                .SetHeader(RabbitMessageHeaders.RETURN_REPLY_CODE, replyCode)
                .SetHeader(RabbitMessageHeaders.RETURN_REPLY_TEXT, replyText)
                .SetHeader(RabbitMessageHeaders.RETURN_EXCHANGE, exchange)
                .SetHeader(RabbitMessageHeaders.RETURN_ROUTING_KEY, returnedRoutingKey);
            }

            var returnedMessage = builder.Build();

            if (ErrorMessageStrategy != null)
            {
                returnedMessage = ErrorMessageStrategy.BuildErrorMessage(
                    new ReturnedRabbitMessageException(returnedMessage, replyCode, replyText, exchange, returnedRoutingKey),
                    null);
            }

            return(returnedMessage);
        }
Example #3
0
        private IMessage BuildConfirmMessage(bool ack, string cause, CorrelationDataWrapper wrapper, object userCorrelationData)
        {
            if (ErrorMessageStrategy == null || ack)
            {
                var headers = new Dictionary <string, object>
                {
                    { RabbitMessageHeaders.PUBLISH_CONFIRM, ack }
                };
                if (!ack && !string.IsNullOrEmpty(cause))
                {
                    headers.Add(RabbitMessageHeaders.PUBLISH_CONFIRM_NACK_CAUSE, cause);
                }

                return(PrepareMessageBuilder(userCorrelationData)
                       .CopyHeaders(headers)
                       .Build());
            }
            else
            {
                return(ErrorMessageStrategy.BuildErrorMessage(
                           new NackedRabbitMessageException(wrapper.Message, wrapper.UserData, cause), null));
            }
        }
Example #4
0
        public override bool Poll(IMessageHandler handler, Type type)
        {
            var message = Receive(type);

            if (message == null)
            {
                return(false);
            }

            var ackCallback = StaticMessageHeaderAccessor.GetAcknowledgmentCallback(message);

            try
            {
                if (RetryTemplate == null)
                {
                    Handle(message, handler);
                }
                else
                {
                    RetryTemplate.Execute((ctx) => Handle(message, handler), _recoveryCallback);
                }

                return(true);
            }
            catch (MessagingException e)
            {
                if (RetryTemplate == null && !ShouldRequeue(e))
                {
                    _messagingTemplate.Send(ErrorChannel, ErrorMessageStrategy.BuildErrorMessage(e, _attributesHolder.Value));
                    return(true);
                }
                else if (!ackCallback.IsAcknowledged && ShouldRequeue(e))
                {
                    AckUtils.Requeue(ackCallback);
                    return(true);
                }
                else
                {
                    AckUtils.AutoNack(ackCallback);
                }

                if (e.FailedMessage.Equals(message))
                {
                    throw;
                }

                throw new MessageHandlingException(message, e);
            }
            catch (Exception e)
            {
                AckUtils.AutoNack(ackCallback);
                if (e is MessageHandlingException && ((MessageHandlingException)e).FailedMessage.Equals(message))
                {
                    throw;
                }

                throw new MessageHandlingException(message, e);
            }
            finally
            {
                AckUtils.AutoAck(ackCallback);
            }
        }