コード例 #1
0
        protected IMessage ToMessagingMessage(IMessage amqpMessage)
        {
            if (BatchingStrategy.CanDebatch(amqpMessage.Headers))
            {
                var list = new List <object>();
                BatchingStrategy.DeBatch(amqpMessage, fragment =>
                {
                    var convertedObject = MessageConverter.FromMessage(amqpMessage, null);
                    if (convertedObject == null)
                    {
                        throw new MessageConversionException("Message converter returned null");
                    }

                    list.Add(convertedObject);
                });

                return(RabbitMessageBuilder.WithPayload(list).CopyHeaders(amqpMessage.Headers).Build());
            }

            PreprocesMessage(amqpMessage);
            var headers         = amqpMessage.Headers;
            var convertedObject = MessageConverter.FromMessage(amqpMessage, InferredArgumentType);

            if (convertedObject == null)
            {
                throw new MessageConversionException("Message converter returned null");
            }

            var builder = (convertedObject is IMessage) ? RabbitMessageBuilder.FromMessage((IMessage)convertedObject) : RabbitMessageBuilder.WithPayload(convertedObject);
            var message = builder.CopyHeadersIfAbsent(headers).Build();

            return(message);
        }
コード例 #2
0
        protected void InvokeHandlerAndProcessResult(IMessage amqpMessage, RC.IModel channel, IMessage message)
        {
            _logger?.LogDebug("Processing [{message}]", message);
            InvocationResult result = null;

            try
            {
                if (Method == null)
                {
                    var accessor = RabbitHeaderAccessor.GetMutableAccessor(message);
                    accessor.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 = RabbitMessageBuilder.FromMessage(message).SetHeader(RabbitMessageHeaders.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);
                }
            }
        }
コード例 #3
0
        public override void OnMessage(IMessage amqpMessage, RC.IModel channel)
        {
            PreprocesMessage(amqpMessage);
            var headers         = amqpMessage.Headers;
            var convertedObject = MessageConverter.FromMessage(amqpMessage, InferredArgumentType);

            if (convertedObject == null)
            {
                throw new MessageConversionException("Message converter returned null");
            }

            var builder = (convertedObject is IMessage message1) ? RabbitMessageBuilder.FromMessage(message1) : RabbitMessageBuilder.WithPayload(convertedObject);
            var message = builder.CopyHeadersIfAbsent(headers).Build();

            InvokeHandlerAndProcessResult(amqpMessage, channel, message);
        }
コード例 #4
0
        public void BuildMessageWithStandardMessage()
        {
            var result = RabbitMessageBuilder.WithPayload("Response")
                         .SetHeader("foo", "bar")
                         .SetHeader(RabbitMessageHeaders.TYPE, "msg_type")
                         .SetHeader(RabbitMessageHeaders.REPLY_TO, "reply")
                         .Build();
            var session      = new Mock <IModel>();
            var listener     = GetSimpleInstance("Echo", typeof(IMessage <string>));
            var replyMessage = listener.BuildMessage(session.Object, result, null);

            Assert.NotNull(replyMessage);
            Assert.Equal("Response", EncodingUtils.GetDefaultEncoding().GetString(replyMessage.Payload));
            Assert.Equal("msg_type", replyMessage.Headers.Type());
            Assert.Equal("reply", replyMessage.Headers.ReplyTo());
            Assert.Equal("bar", replyMessage.Headers.Get <string>("foo"));
        }
コード例 #5
0
 public IMessage <string> Echo(IMessage <string> input)
 {
     return((IMessage <string>)RabbitMessageBuilder.WithPayload(input.Payload)
            .SetHeader(RabbitMessageHeaders.TYPE, "reply")
            .Build());
 }