Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
                    }
                }
            }
        }
Esempio n. 3
0
        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)));
                }
            }
        }