コード例 #1
0
        private void ReturnOrThrow(Message amqpMessage, IModel channel, IMessage message, Exception exceptionToRetrun, Exception exceptionToThrow)
        {
            if (!ReturnExceptions)
            {
                throw exceptionToThrow;
            }

            try
            {
                HandleResult(
                    new InvocationResult(
                        exceptionToRetrun,
                        null,
                        HandlerAdapter.GetReturnTypeFor(message.Payload),
                        HandlerAdapter.Instance,
                        HandlerAdapter.GetMethodFor(message.Payload)),
                    amqpMessage,
                    channel,
                    message);
            }
            catch (ReplyFailureException rfe)
            {
                if (typeof(void).Equals(HandlerAdapter.GetReturnTypeFor(message.Payload)))
                {
                    throw exceptionToThrow;
                }
                else
                {
                    throw;
                }
            }
        }
コード例 #2
0
        protected void InvokeHandlerAndProcessResult(Message amqpMessage, IModel channel, IMessage message)
        {
            _logger?.LogDebug("Processing [" + message + "]");
            InvocationResult result = null;

            try
            {
                if (MessagingMessageConverter.Method == null)
                {
                    amqpMessage.MessageProperties.TargetMethod = HandlerAdapter.GetMethodFor(message.Payload);
                }

                result = InvokeHandler(amqpMessage, channel, message);
                if (result.ReturnValue != null)
                {
                    HandleResult(result, amqpMessage, channel, message);
                }
                else
                {
                    _logger?.LogTrace("No result object given - no result to handle");
                }
            }
            catch (ListenerExecutionFailedException e)
            {
                if (ErrorHandler != null)
                {
                    try
                    {
                        var messageWithChannel = Messaging.Support.MessageBuilder.FromMessage(message).SetHeader(AmqpHeaders.CHANNEL, channel).Build();
                        var errorResult        = ErrorHandler.HandleError(amqpMessage, messageWithChannel, e);
                        if (errorResult != null)
                        {
                            HandleResult(HandlerAdapter.GetInvocationResultFor(errorResult, message.Payload), amqpMessage, channel, message);
                        }
                        else
                        {
                            _logger?.LogTrace("Error handler returned no result");
                        }
                    }
                    catch (Exception ex)
                    {
                        ReturnOrThrow(amqpMessage, channel, message, ex, ex);
                    }
                }
                else
                {
                    ReturnOrThrow(amqpMessage, channel, message, e.InnerException, e);
                }
            }
        }