コード例 #1
0
        public void TestAvoidHangAMQP_508()
        {
            var connectionFactory     = new CachingConnectionFactory("localhost");
            var longName              = new string('x', 300);
            var blockingQueueConsumer = new BlockingQueueConsumer(
                connectionFactory,
                new DefaultMessageHeadersConverter(),
                new ActiveObjectCounter <BlockingQueueConsumer>(),
                AcknowledgeMode.AUTO,
                true,
                1,
                null,
                longName,
                "foobar");

            try
            {
                blockingQueueConsumer.Start();
                throw new Exception("Expected exception");
            }
            catch (FatalListenerStartupException e)
            {
                Assert.IsType <R.Exceptions.WireFormattingException>(e.InnerException);
            }
            finally
            {
                connectionFactory.Destroy();
            }
        }
コード例 #2
0
        public async Task TestDirect()
        {
            var cf        = new CachingConnectionFactory("localhost");
            var container = new DirectMessageListenerContainer(null, cf);

            container.SetQueueNames(Q1, Q2);
            container.ConsumersPerQueue = 2;
            var listener = new ReplyingMessageListener();
            var adapter  = new MessageListenerAdapter(null, listener);

            container.MessageListener     = adapter;
            container.ServiceName         = "simple";
            container.ConsumerTagStrategy = new TestConsumerTagStrategy(testName);
            await container.Start();

            Assert.True(container._startedLatch.Wait(TimeSpan.FromSeconds(10)));
            var template = new RabbitTemplate(cf);

            Assert.Equal("FOO", template.ConvertSendAndReceive <string>(Q1, "foo"));
            Assert.Equal("BAR", template.ConvertSendAndReceive <string>(Q2, "bar"));
            await container.Stop();

            Assert.True(await ConsumersOnQueue(Q1, 0));
            Assert.True(await ConsumersOnQueue(Q2, 0));
            Assert.True(await ActiveConsumerCount(container, 0));
            Assert.Empty(container._consumersByQueue);
            await template.Stop();

            cf.Destroy();
        }
コード例 #3
0
        public void TestAvoidHangAMQP_508()
        {
            var cf       = new CachingConnectionFactory("localhost");
            var admin    = new RabbitAdmin(cf);
            var bytes    = new byte[300];
            var longName = Encoding.UTF8.GetString(bytes).Replace('\u0000', 'x');

            try
            {
                admin.DeclareQueue(new Queue(longName));
                throw new Exception("expected exception");
            }
            catch (Exception)
            {
                // Ignore
            }

            var goodName = "foobar";
            var name     = admin.DeclareQueue(new Queue(goodName));

            Assert.Null(admin.GetQueueProperties(longName));
            Assert.NotNull(admin.GetQueueProperties(goodName));
            admin.DeleteQueue(goodName);
            cf.Destroy();
        }
コード例 #4
0
        public void TestTransactionalLowLevel()
        {
            var connectionFactory = new CachingConnectionFactory("localhost");
            var admin             = new RabbitAdmin(connectionFactory);

            admin.DeclareQueue(new Queue(QUEUE1_NAME));
            admin.DeclareQueue(new Queue(QUEUE2_NAME));
            var template = new RabbitTemplate(connectionFactory);
            var blockingQueueConsumer = new BlockingQueueConsumer(
                connectionFactory,
                new DefaultMessageHeadersConverter(),
                new ActiveObjectCounter <BlockingQueueConsumer>(),
                AcknowledgeMode.AUTO,
                true,
                1,
                null,
                QUEUE1_NAME,
                QUEUE2_NAME);
            var prefix = Guid.NewGuid().ToString();

            blockingQueueConsumer.TagStrategy = new TagStrategy(prefix);
            try
            {
                blockingQueueConsumer.Start();
                int n         = 0;
                var consumers = blockingQueueConsumer.CurrentConsumers();

                // Wait for consumers
                while (n < 100)
                {
                    if (consumers.Count < 2)
                    {
                        n++;
                        Thread.Sleep(100);
                        consumers = blockingQueueConsumer.CurrentConsumers();
                    }
                    else
                    {
                        break;
                    }
                }

                Assert.Equal(2, consumers.Count);
                var tags = new List <string>()
                {
                    consumers[0].ConsumerTag, consumers[1].ConsumerTag
                };
                Assert.Contains(prefix + "#" + QUEUE1_NAME, tags);
                Assert.Contains(prefix + "#" + QUEUE2_NAME, tags);
                blockingQueueConsumer.Stop();
                Assert.Null(template.ReceiveAndConvert <object>(QUEUE1_NAME));
            }
            finally
            {
                admin.DeleteQueue(QUEUE1_NAME);
                admin.DeleteQueue(QUEUE2_NAME);
                connectionFactory.Destroy();
            }
        }
コード例 #5
0
        public async Task TestMasterLocator()
        {
            var factory = new RC.ConnectionFactory
            {
                Uri = new Uri("amqp://*****:*****@localhost:5672/")
            };
            var cf    = new CachingConnectionFactory(factory);
            var admin = new RabbitAdmin(cf);
            var queue = new AnonymousQueue();

            admin.DeclareQueue(queue);
            var client    = new HttpClient();
            var authToken = Encoding.ASCII.GetBytes("guest:guest");

            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(authToken));

            var result = await client.GetAsync("http://localhost:15672/api/queues/%3F/" + queue.QueueName);

            var n = 0;

            while (n++ < 100 && result.StatusCode == HttpStatusCode.NotFound)
            {
                await Task.Delay(100);

                result = await client.GetAsync("http://localhost:15672/api/queues/%2F/" + queue.QueueName);
            }

            Assert.Equal(HttpStatusCode.OK, result.StatusCode);
            var content = await result.Content.ReadAsStringAsync();

            Assert.Contains("x-queue-master-locator", content);
            Assert.Contains("client-local", content);

            queue = new AnonymousQueue
            {
                MasterLocator = null
            };
            admin.DeclareQueue(queue);

            result = await client.GetAsync("http://localhost:15672/api/queues/%3F/" + queue.QueueName);

            n = 0;
            while (n++ < 100 && result.StatusCode == HttpStatusCode.NotFound)
            {
                await Task.Delay(100);

                result = await client.GetAsync("http://localhost:15672/api/queues/%2F/" + queue.QueueName);
            }

            Assert.Equal(HttpStatusCode.OK, result.StatusCode);
            content = await result.Content.ReadAsStringAsync();

            Assert.DoesNotContain("x-queue-master-locator", content);
            Assert.DoesNotContain("client-local", content);
            cf.Destroy();
        }
コード例 #6
0
        public void TestUninterruptibleListenerDMLC()
        {
            var cf    = new CachingConnectionFactory("localhost");
            var admin = new RabbitAdmin(cf);

            admin.DeclareQueue(new Config.Queue("test.shutdown"));

            var container = new DirectMessageListenerContainer(null, cf)
            {
                ShutdownTimeout = 500
            };

            container.SetQueueNames("test.shutdown");
            var latch     = new CountdownEvent(1);
            var testEnded = new CountdownEvent(1);
            var listener  = new TestListener(latch, testEnded);

            container.MessageListener = listener;
            var connection = cf.CreateConnection() as ChannelCachingConnectionProxy;

            // var channels = TestUtils.getPropertyValue(connection, "target.delegate._channelManager._channelMap");
            var field = typeof(RC.Framing.Impl.Connection)
                        .GetField("m_sessionManager", BindingFlags.Instance | BindingFlags.NonPublic);

            Assert.NotNull(field);
            var channels = (SessionManager)field.GetValue(connection.Target.Connection);

            Assert.NotNull(channels);

            container.Start();
            Assert.True(container._startedLatch.Wait(TimeSpan.FromSeconds(10)));

            try
            {
                var template = new RabbitTemplate(cf);
                template.Execute(c =>
                {
                    var properties = c.CreateBasicProperties();
                    var bytes      = EncodingUtils.GetDefaultEncoding().GetBytes("foo");
                    c.BasicPublish(string.Empty, "test.shutdown", false, properties, bytes);
                    RabbitUtils.SetPhysicalCloseRequired(c, false);
                });
                Assert.True(latch.Wait(TimeSpan.FromSeconds(30)));
                Assert.Equal(2, channels.Count);
            }
            finally
            {
                container.Stop();
                Assert.Equal(1, channels.Count);

                cf.Destroy();
                testEnded.Signal();
                admin.DeleteQueue("test.shutdown");
            }
        }
        public void ChannelReleasedOnTimeout()
        {
            var connectionFactory = new CachingConnectionFactory("localhost");
            var rabbitTemplate    = CreateSendAndReceiveRabbitTemplate(connectionFactory);

            rabbitTemplate.ReplyTimeout = 1;
            var exception = new AtomicReference <Exception>();
            var latch     = new CountdownEvent(1);

            rabbitTemplate.ReplyErrorHandler = new TestErrorHandler(exception, latch);
            var reply = rabbitTemplate.ConvertSendAndReceive <object>(ROUTE, "foo");

            Assert.Null(reply);
            var directReplyToContainers = rabbitTemplate._directReplyToContainers;
            var container = rabbitTemplate.UsePublisherConnection ? directReplyToContainers[connectionFactory.PublisherConnectionFactory] : directReplyToContainers[connectionFactory];

            Assert.Empty(container._inUseConsumerChannels);
            Assert.Same(rabbitTemplate.ReplyErrorHandler, container.ErrorHandler);
            var replyMessage = Message.Create(Encoding.UTF8.GetBytes("foo"), new MessageHeaders());

            var ex = Assert.Throws <RabbitRejectAndDontRequeueException>(() => rabbitTemplate.OnMessage(replyMessage));

            Assert.Contains("No correlation header in reply", ex.Message);

            var accessor = RabbitHeaderAccessor.GetMutableAccessor(replyMessage);

            accessor.CorrelationId = "foo";

            ex = Assert.Throws <RabbitRejectAndDontRequeueException>(() => rabbitTemplate.OnMessage(replyMessage));
            Assert.Contains("Reply received after timeout", ex.Message);

            _ = Task.Run(() =>
            {
                var message = rabbitTemplate.Receive(ROUTE, 10000);
                Assert.NotNull(message);
                rabbitTemplate.Send(message.Headers.ReplyTo(), replyMessage);
                return(message);
            });

            while (rabbitTemplate.Receive(ROUTE, 100) != null)
            {
            }

            reply = rabbitTemplate.ConvertSendAndReceive <object>(ROUTE, "foo");
            Assert.Null(reply);
            Assert.True(latch.Wait(TimeSpan.FromSeconds(10)));
            Assert.IsType <ListenerExecutionFailedException>(exception.Value);
            var listException = exception.Value as ListenerExecutionFailedException;

            Assert.Contains("Reply received after timeout", exception.Value.InnerException.Message);
            Assert.Equal(replyMessage.Payload, listException.FailedMessage.Payload);
            Assert.Empty(container._inUseConsumerChannels);
            rabbitTemplate.Stop().Wait();
            connectionFactory.Destroy();
        }
コード例 #8
0
        public void TestNoDeclareWithCachedConnections()
        {
            var services = new ServiceCollection();
            var config   = new ConfigurationBuilder().Build();

            services.AddLogging(b =>
            {
                b.AddDebug();
                b.AddConsole();
            });

            services.AddSingleton <IConfiguration>(config);
            services.AddRabbitHostingServices();

            var mockConnectionFactory = new Mock <RC.IConnectionFactory>();

            var mockConnections  = new List <RC.IConnection>();
            var mockChannels     = new List <RC.IModel>();
            var connectionNumber = new AtomicInteger(-1);
            var channelNumber    = new AtomicInteger(-1);

            mockConnectionFactory.Setup(f => f.CreateConnection(It.IsAny <string>()))
            .Callback(() =>
            {
                var connection    = new Mock <RC.IConnection>();
                var connectionNum = connectionNumber.IncrementAndGet();
                mockConnections.Add(connection.Object);
                connection.Setup(c => c.IsOpen).Returns(true);
                connection.Setup(c => c.ToString()).Returns("mockConnection" + connectionNum);
                connection.Setup(c => c.CreateModel())
                .Callback(() =>
                {
                    var channel = new Mock <RC.IModel>();
                    mockChannels.Add(channel.Object);
                    channel.Setup(c => c.IsOpen).Returns(true);
                    var channelNum = channelNumber.IncrementAndGet();
                    channel.Setup(c => c.ToString()).Returns("mockChannel" + channelNum);
                })
                .Returns(() => mockChannels[channelNumber.Value]);
            })
            .Returns(() => mockConnections[connectionNumber.Value]);

            var ccf   = new CachingConnectionFactory(mockConnectionFactory.Object, false, CachingConnectionFactory.CachingMode.CONNECTION);
            var queue = new Queue("foo");

            services.AddRabbitQueue(queue);
            var provider = services.BuildServiceProvider();
            var context  = provider.GetApplicationContext();
            var admin    = new RabbitAdmin(context, ccf);

            ccf.CreateConnection().Close();
            ccf.Destroy();
            Assert.Empty(mockChannels);
        }
コード例 #9
0
        public async Task TestReleaseConsumerRace()
        {
            var connectionFactory = new CachingConnectionFactory("localhost");
            var container         = new DirectReplyToMessageListenerContainer(null, connectionFactory);

            var latch = new CountdownEvent(1);

            container.MessageListener = new EmptyListener();
            var mockMessageListener = new MockChannelAwareMessageListener(container.MessageListener, latch);

            container.SetChannelAwareMessageListener(mockMessageListener);

            var foobytes = EncodingUtils.GetDefaultEncoding().GetBytes("foo");
            var barbytes = EncodingUtils.GetDefaultEncoding().GetBytes("bar");
            await container.Start();

            Assert.True(container._startedLatch.Wait(TimeSpan.FromSeconds(10)));

            var channel1 = container.GetChannelHolder();
            var props    = channel1.Channel.CreateBasicProperties();

            props.ReplyTo = Address.AMQ_RABBITMQ_REPLY_TO;
            RC.IModelExensions.BasicPublish(channel1.Channel, string.Empty, TEST_RELEASE_CONSUMER_Q, props, foobytes);
            var replyChannel = connectionFactory.CreateConnection().CreateChannel(false);
            var request      = replyChannel.BasicGet(TEST_RELEASE_CONSUMER_Q, true);
            var n            = 0;

            while (n++ < 100 && request == null)
            {
                Thread.Sleep(100);
                request = replyChannel.BasicGet(TEST_RELEASE_CONSUMER_Q, true);
            }

            Assert.NotNull(request);
            props = channel1.Channel.CreateBasicProperties();
            RC.IModelExensions.BasicPublish(replyChannel, string.Empty, request.BasicProperties.ReplyTo, props, barbytes);
            replyChannel.Close();
            Assert.True(latch.Wait(TimeSpan.FromSeconds(10)));

            var channel2 = container.GetChannelHolder();

            Assert.Same(channel1.Channel, channel2.Channel);
            container.ReleaseConsumerFor(channel1, false, null); // simulate race for future timeout/cancel and onMessage()
            var inUse = container._inUseConsumerChannels;

            Assert.Single(inUse);
            container.ReleaseConsumerFor(channel2, false, null);
            Assert.Empty(inUse);
            await container.Stop();

            connectionFactory.Destroy();
        }
コード例 #10
0
        public void TestAck()
        {
            var config   = new ConfigurationBuilder().Build();
            var services = new ServiceCollection().BuildServiceProvider();
            var context  = new GenericApplicationContext(services, config);
            var channel  = new Mock <R.IModel>();

            channel.Setup(c => c.IsOpen).Returns(true);
            var props       = new MockRabbitBasicProperties();
            var getResponse = new R.BasicGetResult(123Ul, false, "ex", "rk", 0, props, Encoding.UTF8.GetBytes("foo"));

            channel.Setup(c => c.BasicGet("foo", false)).Returns(getResponse);
            var connection = new Mock <R.IConnection>();

            connection.Setup(c => c.IsOpen).Returns(true);
            connection.Setup(c => c.CreateModel()).Returns(channel.Object);
            var connectionFactory = new Mock <R.IConnectionFactory>();

            connectionFactory.Setup(f => f.CreateConnection(It.IsAny <string>())).Returns(connection.Object);

            var ccf    = new CachingConnectionFactory(connectionFactory.Object);
            var source = new RabbitMessageSource(context, ccf, "foo");

            source.RawMessageHeader = true;
            var received   = source.Receive();
            var rawMessage = received.Headers.Get <IMessage>(RabbitMessageHeaderErrorMessageStrategy.AMQP_RAW_MESSAGE);
            var sourceData = received.Headers.Get <IMessage>(IntegrationMessageHeaderAccessor.SOURCE_DATA);

            Assert.NotNull(rawMessage);
            Assert.Same(rawMessage, sourceData);
            Assert.Equal("foo", received.Headers.Get <string>(RabbitMessageHeaders.CONSUMER_QUEUE));

            // make sure channel is not cached
            var conn      = ccf.CreateConnection();
            var notCached = conn.CreateChannel(false);

            connection.Verify(c => c.CreateModel(), Times.Exactly(2));
            var callback = received.Headers.Get <IAcknowledgmentCallback>(IntegrationMessageHeaderAccessor.ACKNOWLEDGMENT_CALLBACK);

            callback.Acknowledge(Status.ACCEPT);
            channel.Verify(c => c.BasicAck(123ul, false));
            var cached = conn.CreateChannel(false); // should have been "closed"

            connection.Verify(c => c.CreateModel(), Times.Exactly(2));
            notCached.Close();
            cached.Close();
            ccf.Destroy();
            channel.Verify(c => c.Close(), Times.Exactly(2));
            connection.Verify(c => c.Close(30000));
        }
コード例 #11
0
        private void TestNackOrRequeue(bool requeue)
        {
            var config   = new ConfigurationBuilder().Build();
            var services = new ServiceCollection().BuildServiceProvider();
            var context  = new GenericApplicationContext(services, config);

            var channel = new Mock <R.IModel>();

            channel.Setup(c => c.IsOpen).Returns(true);
            var props       = new MockRabbitBasicProperties();
            var getResponse = new R.BasicGetResult(123Ul, false, "ex", "rk", 0, props, Encoding.UTF8.GetBytes("bar"));

            channel.Setup(c => c.BasicGet("foo", false)).Returns(getResponse);
            var connection = new Mock <R.IConnection>();

            connection.Setup(c => c.IsOpen).Returns(true);
            connection.Setup(c => c.CreateModel()).Returns(channel.Object);
            var connectionFactory = new Mock <R.IConnectionFactory>();

            connectionFactory.Setup(f => f.CreateConnection(It.IsAny <string>())).Returns(connection.Object);

            var ccf      = new CachingConnectionFactory(connectionFactory.Object);
            var source   = new RabbitMessageSource(context, ccf, "foo");
            var received = source.Receive();

            connection.Verify(c => c.CreateModel());
            var callback = received.Headers.Get <IAcknowledgmentCallback>(IntegrationMessageHeaderAccessor.ACKNOWLEDGMENT_CALLBACK);

            if (requeue)
            {
                callback.Acknowledge(Status.REQUEUE);
            }
            else
            {
                callback.Acknowledge(Status.REJECT);
            }

            channel.Verify(c => c.BasicReject(123ul, requeue));
            connection.Verify(c => c.CreateModel());
            ccf.Destroy();
            channel.Verify(c => c.Close());
            connection.Verify(c => c.Close(30000));
        }
コード例 #12
0
        public void TestSendAndReceiveWithTopicConsumeInBackground()
        {
            provider = services.BuildServiceProvider();
            var admin    = provider.GetRabbitAdmin();
            var exchange = new TopicExchange("topic");

            admin.DeclareExchange(exchange);
            var template = provider.GetRabbitTemplate();

            template.DefaultSendDestination = new RabbitDestination(exchange.ExchangeName, string.Empty);
            var binding = BindingBuilder.Bind(queue).To(exchange).With("*.end");

            admin.DeclareBinding(binding);

            var cachingConnectionFactory = new CachingConnectionFactory("localhost");
            var template1 = new RabbitTemplate(cachingConnectionFactory)
            {
                DefaultSendDestination = new RabbitDestination(exchange.ExchangeName, string.Empty)
            };

            var consumer = template1.Execute(channel =>
            {
                var consumer1 = CreateConsumer(template1.ConnectionFactory);
                var tag       = consumer1.GetConsumerTags()[0];
                Assert.NotNull(tag);

                return(consumer1);
            });

            template1.ConvertAndSend("foo", "message");
            var result = GetResult(consumer, false);

            Assert.Null(result);

            template1.ConvertAndSend("foo.end", "message");
            result = GetResult(consumer, true);
            Assert.Equal("message", result);

            consumer.Stop();
            admin.DeleteExchange("topic");
            cachingConnectionFactory.Destroy();
        }
 public void Dispose()
 {
     connectionFactory.Destroy();
 }