public void MessageProcessFailedOnce_RejectMessageUsingExceptionFilter_CheckMessageDeliveredToDeadLetterQ() { using (RabbitMQBus entityA = new RabbitMQBus(), entityB = new RabbitMQBus(), entityC = new RabbitMQBus(c => c.UseConnectionString("amqp://localhost/amq.direct"))) { TransactionalPerson message = new TransactionalPerson { Id = 5 }; ManualResetEvent ev = new ManualResetEvent(false); int counter = 0; BusMessage <TransactionalPerson> actual = null; using (ISubscriber subscriberA = entityA.CreateSubscriber(c => c.UseDurableQueue(QueueName).UseTransactionalDelivery(new MyFilter()))) { subscriberA.Subscribe((Action <TransactionalPerson>)(d => { counter++; throw new Exception(); })); subscriberA.Open(); using (ISubscriber deadLetterSubscriber = entityC.CreateSubscriber(c => c.UseDurableQueue(DeadLetterQueueName))) { deadLetterSubscriber.Subscribe <TransactionalPerson>(m => { actual = m; ev.Set(); }); deadLetterSubscriber.Open(); const int expected = 2; using (IPublisher publisher = entityB.CreatePublisher()) { publisher.Send(message); } bool waitOne = ev.WaitOne(TimeSpan.FromSeconds(50)); counter.Should().BeGreaterOrEqualTo(expected); waitOne.Should().BeTrue(); actual.Data.ShouldBeEquivalentTo(message); XDeadHeader xDeadHeader = actual.Headers.OfType <XDeadHeader>().First(); xDeadHeader.Exchange.Should().Be("amq.headers"); xDeadHeader.Reason.Should().Be("rejected"); xDeadHeader.Queue.Should().Be(QueueName); } } } }
public void MessageProcessFailedOnce_CheckMessageRedelivered() { using (RabbitMQBus entityA = new RabbitMQBus(), entityB = new RabbitMQBus()) { TransactionalPerson message = new TransactionalPerson { Id = 5 }; ManualResetEvent ev = new ManualResetEvent(false); int counter = 0; using (ISubscriber subscriberA = entityA.CreateSubscriber(c => c.UseTransactionalDelivery())) { subscriberA.Subscribe((Action <TransactionalPerson>)(d => { counter++; if (counter == 1) { throw new Exception(); } })); subscriberA.Open(); const int expected = 2; using (IPublisher publisher = entityB.CreatePublisher()) { publisher.Send(message); } ev.WaitOne(TimeSpan.FromSeconds(5)); counter.Should().Be(expected); } } }