Example #1
0
        /// <summary>
        /// 测试方法
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            BaseEventSender     sender     = new BaseEventSender(1000);
            BaseEventSubscriber subscriber = new BaseEventSubscriber(sender);

            sender.Run();
            RabbitMqMessageReceiver receiver = new RabbitMqMessageReceiver();

            receiver.ReceiveMessage();
            Console.ReadKey();
        }
        public void CreateModelIsCalledInConstructor()
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);

            // Act
            _ = new RabbitMqMessageReceiver(contextMock.Object, "test.queue", null);

            // Assert
            connectionMock.Verify(e => e.CreateModel());
        }
        public void QueueNameIsProperlySet(string queueName)
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);

            // Act
            var result = new RabbitMqMessageReceiver(contextMock.Object, queueName, null);

            // Assert
            Assert.AreEqual(queueName, result.QueueName);
        }
        public void TopicExpressionsIsProperlySet(string topics)
        {
            // Arrange
            var topicNames     = topics.Split(',');
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);

            // Act
            var result = new RabbitMqMessageReceiver(contextMock.Object, "test.queue", topicNames);

            // Assert
            Assert.AreSame(topicNames, result.TopicFilters);
        }
        public void StartReceivingMessagesDeclaresQueue(string queueName)
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);

            var receiver = new RabbitMqMessageReceiver(contextMock.Object, queueName, new string[0]);

            // Act
            receiver.StartReceivingMessages();

            // Assert
            modelMock.Verify(e => e.QueueDeclare(queueName, true, false, false, null));
        }
        public void DisposeIsCalledOnModel()
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);

            var receiver = new RabbitMqMessageReceiver(contextMock.Object, "test.queue", new string[0]);

            // Act
            receiver.Dispose();

            // Assert
            modelMock.Verify(e => e.Dispose());
        }
        public void PauseCallsBasicCancelOnModel()
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);
            var receiver = new RabbitMqMessageReceiver(contextMock.Object, "queue", new string[0]);

            receiver.StartReceivingMessages();

            // Act
            receiver.Pause();

            // Assert
            modelMock.Verify(e => e.BasicCancel(It.IsAny <string>()));
        }
        public void ResumeThrowsExceptionWhenNotListening()
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);
            var receiver = new RabbitMqMessageReceiver(contextMock.Object, "queue", new string[0]);

            // Act
            void Act() => receiver.Resume();

            // Assert
            BusConfigurationException exception = Assert.ThrowsException <BusConfigurationException>(Act);

            Assert.AreEqual("Attempting to resume the MessageReceiver, but it is not even receiving messages.", exception.Message);
        }
        public void StartHandlingMessagesCallsBasicConsume(string queueName)
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);

            var receiver = new RabbitMqMessageReceiver(contextMock.Object, queueName, new string[0]);

            receiver.StartReceivingMessages();

            // Act
            receiver.StartHandlingMessages(e => {});

            // Assert
            modelMock.Verify(e => e.BasicConsume(queueName, true, It.IsAny <string>(), false, false, null, It.IsAny <IBasicConsumer>()));
        }
        public void StartHandlingMessagesThrowsExceptionOnNotListening()
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);

            var receiver = new RabbitMqMessageReceiver(contextMock.Object, "test.queue", null);

            // Act
            void Act() => receiver.StartHandlingMessages(e => {});

            // Assert
            var exception = Assert.ThrowsException <BusConfigurationException>(Act);

            Assert.AreEqual("Receiver is not listening to events", exception.Message);
        }
        public void CallbackIsCalledWithProperMessage(string exchangeName, string topic, string eventType)
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);

            IBasicConsumer consumer = null;

            // Retrieve consumer from callback
            var receiver = new RabbitMqMessageReceiver(contextMock.Object, "test.queue", new string[0]);

            modelMock.Setup(
                e => e.BasicConsume("test.queue", true, It.IsAny <string>(), false, false, null, It.IsAny <IBasicConsumer>()))
            .Callback <string, bool, string, bool, bool, IDictionary <string, object>, IBasicConsumer>(
                (a, b, c, d, e, f, givenConsumer) => consumer = givenConsumer);

            EventMessage eventMessage = null;

            receiver.StartReceivingMessages();
            receiver.StartHandlingMessages(e => eventMessage = e);

            Guid             guid       = Guid.NewGuid();
            IBasicProperties properties = new BasicProperties
            {
                CorrelationId = guid.ToString(),
                Type          = eventType
            };

            // Act
            Thread.Sleep(WaitTime);
            consumer.HandleBasicDeliver(It.IsAny <string>(), 0, false, exchangeName, topic, properties, new byte[0]);

            // Assert
            Assert.AreEqual(topic, eventMessage.Topic);
            Assert.AreEqual(eventType, eventMessage.EventType);
            Assert.AreEqual(guid, eventMessage.CorrelationId);
        }
        static void Main(string[] args)
        {
            IMessageSender ms = new RabbitMqMessageSender("TestQ");

            Console.WriteLine("Connected to TestQ...");

            var o = new Wibbler("Hello Matey");

            ms.PublishObjectAsMessage(o);

            RabbitMqMessageReceiver mr = new RabbitMqMessageReceiver("TestQ");

            mr.Consumer.Received += (sender, e) =>
            {
                var     body    = e.Body;
                var     message = Encoding.UTF8.GetString(body);
                Wibbler w       = JsonConvert.DeserializeObject <Wibbler>(message);
                Console.SetCursorPosition(0, Console.CursorTop - 2);
                Console.WriteLine($" [x] Received {w.Id} on {mr.QueueName}, containing the comment {w.Comment}");
                Console.WriteLine("                                                                           ");
                Console.WriteLine("Press [enter] to exit...");
            };

            mr.ConsumeMessage();
            Console.WriteLine("Press [enter] to exit...");

            var t = new System.Timers.Timer(5000);

            t.Elapsed += (sender, e) =>
            {
                ms.PublishObjectAsMessage(o);
            };

            t.Start();

            Console.ReadLine();

            ms.Dispose();
            mr.Dispose();
        }
        public void StartReceivingMessagesCanOnlyBeCalledOnce()
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);

            var receiver = new RabbitMqMessageReceiver(contextMock.Object, "test.queue", new string[0]);

            receiver.StartReceivingMessages();

            // Act
            void Act() => receiver.StartReceivingMessages();

            // Assert
            var exception = Assert.ThrowsException <BusConfigurationException>(Act);

            Assert.AreEqual("Receiver is already listening to events!", exception.Message);
        }
        public void PauseThrowsExceptionIfAlreadyPaused()
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);
            var receiver = new RabbitMqMessageReceiver(contextMock.Object, "queue", new string[0]);

            receiver.StartReceivingMessages();
            receiver.Pause();

            // Act
            void Act() => receiver.Pause();

            // Assert
            BusConfigurationException exception = Assert.ThrowsException <BusConfigurationException>(Act);

            Assert.AreEqual("Attempting to pause the MessageReceiver, but it was already paused.", exception.Message);
        }
        public void StartReceivingMessagesBindsQueueToTopics(string exchangeName, string queueName, string topics)
        {
            // Arrange
            var topicNames     = topics.Split(',');
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            contextMock.Setup(e => e.ExchangeName).Returns(exchangeName);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);

            var receiver = new RabbitMqMessageReceiver(contextMock.Object, queueName, topicNames);

            // Act
            receiver.StartReceivingMessages();

            // Assert
            foreach (string topic in topicNames)
            {
                modelMock.Verify(e => e.QueueBind(queueName, exchangeName, topic, null));
            }
        }