public void Resolve_ConsumerNotFound_ConsumerNotFoundExceptionThrown()
        {
            //Arrange
            var fakeService      = Substitute.For <IFakeService>();
            var fakeLogger       = Substitute.For <ILogger <ConsumerResolver> >();
            var firstConsumer    = new FirstMessageConsumer(fakeService);
            var secondConsumer   = new SecondMessageConsumer(fakeService);
            var consumers        = new IConsumer[] { firstConsumer, secondConsumer };
            var consumerResolver = new ConsumerResolver(consumers, fakeLogger);
            var message          = new SecondMessage {
                Value = "First Message"
            };
            var messageAsString = JsonConvert.SerializeObject(message);
            var messageType     = "fakeMessageType";
            var sqsMessage      = new Message
            {
                MessageAttributes = new Dictionary <string, MessageAttributeValue>
                {
                    { "MessageType", new MessageAttributeValue {
                          StringValue = messageType
                      } }
                },
                Body = messageAsString
            };

            //Act
            var task = consumerResolver.Resolve(sqsMessage, CancellationToken.None);

            //Assert
            Should.Throw <ConsumerNotFoundException>(task);
        }
        public async Task Resolve_SecondMessageConsumerFound_HandleMethodIsInvoked()
        {
            //Arrange
            var fakeService      = Substitute.For <IFakeService>();
            var fakeLogger       = Substitute.For <ILogger <ConsumerResolver> >();
            var firstConsumer    = new FirstMessageConsumer(fakeService);
            var secondConsumer   = new SecondMessageConsumer(fakeService);
            var consumers        = new IConsumer[] { firstConsumer, secondConsumer };
            var consumerResolver = new ConsumerResolver(consumers, fakeLogger);
            var message          = new SecondMessage {
                Value = "First Message"
            };
            var messageAsString = JsonConvert.SerializeObject(message);
            var messageType     = nameof(SecondMessage);
            var sqsMessage      = new Message
            {
                MessageAttributes = new Dictionary <string, MessageAttributeValue>
                {
                    { "MessageType", new MessageAttributeValue {
                          StringValue = messageType
                      } }
                },
                Body = messageAsString
            };

            //Act
            await consumerResolver.Resolve(sqsMessage, CancellationToken.None);

            //Assert
            fakeService.DidNotReceive().FirstMethod();
            fakeService.Received(1).SecondMethod();
        }
示例#3
0
        internal override void RegisterChannel <T>(IBasicProperties basicProperties, AbstractConsumer <T> consumer, string queue, string errorQueue, string exchange, string routingKey)
        {
            Logger.Info("Consumer has been registering. Consumer: " + consumer + ", queue: " + queue + ", errorRoute: " + errorQueue);
            ConsumerResolver <T> resolver = (int eventId, string eventName, string contractVersion) =>
            {
                return(consumer);
            };

            this.ChannelRegistration(basicProperties, queue, errorQueue, exchange, routingKey, resolver);
        }
示例#4
0
        internal override void RegisterChannel <T>(IBasicProperties basicProperties, AbstractConsumerFactory <T> factory, string queue, string errorQueue, string exchange, string routingKey)
        {
            Logger.Info("Registering... Consumer: " + factory + ", route: " + queue + ", errorRoute: " + errorQueue);

            ConsumerResolver <T> resolver = (int eventId, string eventName, string contractVersion) =>
            {
                if (eventId == Int32.MinValue)
                {
                    return(factory.ResolveEvent(eventName, contractVersion));
                }
                return(factory.ResolveEvent(eventId, contractVersion));
            };

            this.ChannelRegistration(basicProperties, queue, errorQueue, exchange, routingKey, resolver);
        }
        public async Task Resolve_ConsumersFound_TwoMethodsAreInvokedTwice()
        {
            //Arrange
            var fakeService      = Substitute.For <IFakeService>();
            var fakeLogger       = Substitute.For <ILogger <ConsumerResolver> >();
            var firstConsumer    = new FirstMessageConsumer(fakeService);
            var secondConsumer   = new SecondMessageConsumer(fakeService);
            var thirdConsumer    = new ThirdMessageConsumer(fakeService);
            var consumers        = new IConsumer[] { firstConsumer, secondConsumer, thirdConsumer };
            var consumerResolver = new ConsumerResolver(consumers, fakeLogger);
            var firstMessage     = new FirstMessage {
                Value = "First Message"
            };
            var firstSqsMessage = new Message
            {
                MessageAttributes = new Dictionary <string, MessageAttributeValue>
                {
                    { "MessageType", new MessageAttributeValue {
                          StringValue = nameof(FirstMessage)
                      } }
                },
                Body = JsonConvert.SerializeObject(firstMessage)
            };

            var secondMessage = new SecondMessage {
                Value = "Second Message"
            };
            var secondSqsMessage = new Message
            {
                MessageAttributes = new Dictionary <string, MessageAttributeValue>
                {
                    { "MessageType", new MessageAttributeValue {
                          StringValue = nameof(SecondMessage)
                      } }
                },
                Body = JsonConvert.SerializeObject(secondMessage)
            };

            //Act
            await consumerResolver.Resolve(firstSqsMessage, CancellationToken.None);

            await consumerResolver.Resolve(secondSqsMessage, CancellationToken.None);

            //Assert
            fakeService.Received(2).FirstMethod();
            fakeService.Received(2).SecondMethod();
        }
示例#6
0
        public void Resolve_ConsumerNotFound_ConsumerNotFoundExceptionThrown()
        {
            //Arrange
            var fakeService      = Substitute.For <IFakeService>();
            var firstConsumer    = new FirstMessageConsumer(fakeService);
            var secondConsumer   = new SecondMessageConsumer(fakeService);
            var consumers        = new IConsumer[] { firstConsumer, secondConsumer };
            var consumerResolver = new ConsumerResolver(consumers);
            var message          = new SecondMessage {
                Value = "First Message"
            };
            var messageAsString = JsonConvert.SerializeObject(message);
            var messageType     = "fakeMessageType";

            //Act
            var task = consumerResolver.Resolve(messageAsString, messageType, CancellationToken.None);

            //Assert
            Should.Throw <ConsumerNotFoundException>(task);
        }
示例#7
0
        public async Task Resolve_SecondMessageConsumerFound_HandleMethodIsInvoked()
        {
            //Arrange
            var fakeService      = Substitute.For <IFakeService>();
            var firstConsumer    = new FirstMessageConsumer(fakeService);
            var secondConsumer   = new SecondMessageConsumer(fakeService);
            var consumers        = new IConsumer[] { firstConsumer, secondConsumer };
            var consumerResolver = new ConsumerResolver(consumers);
            var message          = new SecondMessage {
                Value = "First Message"
            };
            var messageAsString = JsonConvert.SerializeObject(message);
            var messageType     = nameof(SecondMessage);

            //Act
            await consumerResolver.Resolve(messageAsString, messageType, CancellationToken.None);

            //Assert
            fakeService.DidNotReceive().FirstMethod();
            fakeService.Received(1).SecondMethod();
        }
示例#8
0
        private void ChannelRegistration <T>(IBasicProperties basicProperties, string queue, string errorQueue, string exchange, string routingKey, ConsumerResolver <T> resolver)
        {
            var rabbitConsumer = new EventingBasicConsumer(channel);

            rabbitConsumer.Received += (model, ea) =>
            {
                var serializer = RabbitMQWrapperConnection.DefaultAdapter;
                try
                {
                    var message = serializer.DeserializeBytes <RabbitMQWrapperMessage <T> >(ea.Body);

                    AbstractConsumer <T> consumer = null;
                    try
                    {
                        consumer = resolver(message.EventID, message.Event, message.ContractVersion);

                        if (message.Event == "")
                        {
                            consumer.Consume(message.EventID, message.Content, message.ContractVersion);
                        }
                        consumer.Consume(message.Event, message.Content, message.ContractVersion);
                    }
                    catch (Exception e)
                    {
                        Logger.Error("Consumer: " + consumer + " has unexpected error", e);
                        channel.BasicNack(deliveryTag: ea.DeliveryTag, multiple: false, requeue: true);
                        return;
                    }

                    try
                    {
                        channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
                    }
                    catch (Exception e)
                    {
                        Logger.Error("Connection lost", e);
                        throw e;
                    }
                }
                catch (JsonException e)
                {
                    var customError = new UnexpectedException(e);
                    Logger.Error("Could not deserialize the object: " + ea.Body, customError);
                    try
                    {
                        Logger.Warn("Creating error queue...");
                        this.EnsureRoute(errorQueue, exchange, routingKey);
                        this.channel.BasicPublish(exchange: exchange, routingKey: routingKey, basicProperties: basicProperties, body: ea.Body);
                        channel.BasicNack(deliveryTag: ea.DeliveryTag, multiple: false, requeue: false);
                    }
                    catch (Exception ex)
                    {
                        var custom = new UnexpectedException(ex);
                        Logger.Fatal("Unexpected error occured while publishing items to error queue", custom);
                        throw custom;
                    }
                }
                catch (Exception e)
                {
                    var custom = new UnexpectedException(e);
                    Logger.Fatal("Unexpected error occured while consumer received a message", custom);
                    throw custom;
                }
            };

            try
            {
                channel.BasicConsume(queue: queue, noAck: false, consumer: rabbitConsumer, consumerTag: appKey);
            }
            catch (IOException e)
            {
                if (channel.IsOpen == false)
                {
                    var custom = new ConnectionClosedException(e);
                    Logger.Info("Trying to reconnect again... Queue:" + queue, custom);
                    Thread.Sleep(200);
                    channel.BasicConsume(queue: queue, noAck: false, consumer: rabbitConsumer, consumerTag: appKey);
                }
                else
                {
                    var custom = new AccessDeniedException(e);
                    Logger.Fatal("Access denied. Queue: " + queue, custom);
                    throw custom;
                }
            }
        }