public void TestCreateModelOnClosedAutorecoveringConnectionDoesNotHang()
        {
            // we don't want this to recover quickly in this test
            AutorecoveringConnection c = CreateAutorecoveringConnection(TimeSpan.FromSeconds(20));

            try
            {
                c.Close();
                WaitForShutdown(c);
                Assert.IsFalse(c.IsOpen);
                c.CreateModel();
                Assert.Fail("Expected an exception");
            }
            catch (AlreadyClosedException)
            {
                // expected
            }
            finally
            {
                StartRabbitMQ();
                if (c.IsOpen)
                {
                    c.Abort();
                }
            }
        }
        public void TestRecoveryWithTopologyDisabled()
        {
            AutorecoveringConnection conn = CreateAutorecoveringConnectionWithTopologyRecoveryDisabled();
            IModel ch = conn.CreateModel();
            string s  = "dotnet-client.test.recovery.q2";

            ch.QueueDelete(s);
            ch.QueueDeclare(s, false, true, false, null);
            ch.QueueDeclarePassive(s);
            Assert.IsTrue(ch.IsOpen);

            try
            {
                CloseAndWaitForRecovery(conn);
                Assert.IsTrue(ch.IsOpen);
                ch.QueueDeclarePassive(s);
                Assert.Fail("Expected an exception");
            } catch (OperationInterruptedException e)
            {
                // expected
            } finally
            {
                conn.Abort();
            }
        }
Exemplo n.º 3
0
        public void TestConsumerRecoveryOnClientNamedQueueWithOneRecovery()
        {
            AutorecoveringConnection c = CreateAutorecoveringConnection();
            IModel m = c.CreateModel();
            string q = m.QueueDeclare("dotnet-client.recovery.queue1",
                                      false, false, false, null).QueueName;
            var cons = new EventingBasicConsumer(m);

            m.BasicConsume(q, true, cons);
            AssertConsumerCount(m, q, 1);

            string latestName = null;

            c.QueueNameChangeAfterRecovery += (source, ea) => { latestName = ea.NameAfter; };

            CloseAndWaitForRecovery(c);
            AssertConsumerCount(m, latestName, 1);
            CloseAndWaitForRecovery(c);
            AssertConsumerCount(m, latestName, 1);
            CloseAndWaitForRecovery(c);
            AssertConsumerCount(m, latestName, 1);

            var latch = new ManualResetEvent(false);

            cons.Received += (s, args) => latch.Set();

            m.BasicPublish("", q, null, encoding.GetBytes("msg"));
            Wait(latch);

            m.QueueDelete(q);
        }
 internal void PublishMessagesWhileClosingConn(string queueName)
 {
     using (AutorecoveringConnection publishingConn = CreateAutorecoveringConnection())
     {
         using (IModel publishingModel = publishingConn.CreateModel())
         {
             for (ushort i = 0; i < _totalMessageCount; i++)
             {
                 if (i == _closeAtCount)
                 {
                     CloseConnection(_conn);
                 }
                 publishingModel.BasicPublish(string.Empty, queueName, _messageBody);
             }
         }
     }
 }
        internal void TestDelayedBasicAckNackAfterChannelRecovery(TestBasicConsumer1 cons, ManualResetEventSlim latch)
        {
            string q = _model.QueueDeclare(GenerateQueueName(), false, false, false, null).QueueName;
            int    n = 30;

            _model.BasicQos(0, 1, false);
            _model.BasicConsume(q, false, cons);

            AutorecoveringConnection publishingConn = CreateAutorecoveringConnection();
            IModel publishingModel = publishingConn.CreateModel();

            for (int i = 0; i < n; i++)
            {
                publishingModel.BasicPublish("", q, null, _encoding.GetBytes(""));
            }

            Wait(latch, TimeSpan.FromSeconds(20));
            _model.QueueDelete(q);
            publishingModel.Close();
            publishingConn.Close();
        }
        public void TestConsumerRecoveryOnClientNamedQueueWithOneRecovery()
        {
            string q0 = "dotnet-client.recovery.queue1";

            using (AutorecoveringConnection c = CreateAutorecoveringConnection())
            {
                IModel m  = c.CreateModel();
                string q1 = m.QueueDeclare(q0, false, false, false, null).QueueName;
                Assert.AreEqual(q0, q1);

                var cons = new EventingBasicConsumer(m);
                m.BasicConsume(q1, true, cons);
                AssertConsumerCount(m, q1, 1);

                bool queueNameChangeAfterRecoveryCalled = false;

                c.QueueNameChangeAfterRecovery += (source, ea) => { queueNameChangeAfterRecoveryCalled = true; };

                CloseAndWaitForRecovery(c);
                AssertConsumerCount(m, q1, 1);
                Assert.False(queueNameChangeAfterRecoveryCalled);

                CloseAndWaitForRecovery(c);
                AssertConsumerCount(m, q1, 1);
                Assert.False(queueNameChangeAfterRecoveryCalled);

                CloseAndWaitForRecovery(c);
                AssertConsumerCount(m, q1, 1);
                Assert.False(queueNameChangeAfterRecoveryCalled);

                var latch = new ManualResetEventSlim(false);
                cons.Received += (s, args) => latch.Set();

                m.BasicPublish("", q1, null, _encoding.GetBytes("msg"));
                Wait(latch);

                m.QueueDelete(q1);
            }
        }
        public void TestConsumerWorkServiceRecovery()
        {
            using (AutorecoveringConnection c = CreateAutorecoveringConnection())
            {
                IModel m = c.CreateModel();
                string q = m.QueueDeclare("dotnet-client.recovery.consumer_work_pool1",
                                          false, false, false, null).QueueName;
                var cons = new EventingBasicConsumer(m);
                m.BasicConsume(q, true, cons);
                AssertConsumerCount(m, q, 1);

                CloseAndWaitForRecovery(c);

                Assert.IsTrue(m.IsOpen);
                var latch = new ManualResetEventSlim(false);
                cons.Received += (s, args) => latch.Set();

                m.BasicPublish("", q, null, _encoding.GetBytes("msg"));
                Wait(latch);

                m.QueueDelete(q);
            }
        }