private static XDeadHeader BuildXDeadHeader(object o) { List <object> list = (List <object>)o; Dictionary <string, object> values = (Dictionary <string, object>)list[0]; byte[] reason = (byte[])values["reason"]; byte[] queue = (byte[])values["queue"]; AmqpTimestamp time = (AmqpTimestamp)values["time"]; byte[] exchange = (byte[])values["exchange"]; List <object> routingKeys = (List <object>)values["routing-keys"]; XDeadHeader xDeadHeader = new XDeadHeader { Reason = Encoding.ASCII.GetString(reason), Queue = Encoding.ASCII.GetString(queue), Exchange = Encoding.ASCII.GetString(exchange), Time = time.GetDateTime() }; foreach (var routingKey in routingKeys) { xDeadHeader.RoutingKeys.Add(Encoding.ASCII.GetString((byte[])routingKey)); } return(xDeadHeader); }
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); } } } }
private void ConstructHeaders(BusMessage message, IBasicProperties properties) { foreach (KeyValuePair <string, object> header in properties.Headers) { object o = header.Value; if (header.Key == XDeadHeader.WellknownName) { List <object> list = (List <object>)o; Dictionary <string, object> values = (Dictionary <string, object>)list[0]; byte[] reason = (byte[])values["reason"]; byte[] queue = (byte[])values["queue"]; AmqpTimestamp time = (AmqpTimestamp)values["time"]; byte[] exchange = (byte[])values["exchange"]; List <object> routingKeys = (List <object>)values["routing-keys"]; XDeadHeader xDeadHeader = new XDeadHeader { Reason = Encoding.ASCII.GetString(reason), Queue = Encoding.ASCII.GetString(queue), Exchange = Encoding.ASCII.GetString(exchange), Time = time.GetDateTime() }; foreach (var routingKey in routingKeys) { xDeadHeader.RoutingKeys.Add(Encoding.ASCII.GetString((byte[])routingKey)); } message.Headers.Add(xDeadHeader); } else if (header.Key == RejectedHeader.WellknownName) { message.Headers.Add(new RejectedHeader()); } else if (header.Key == ExceptionHeader.WellknownName) { message.Headers.Add(new ExceptionHeader { Message = Encoding.ASCII.GetString((byte[])o) }); } else { message.Headers.Add(new BusHeader(header.Key, Encoding.ASCII.GetString((byte[])o))); } } }