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(); }
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); }
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(); }
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); }
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(); }
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; } } }