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