首页 新闻 会员 周边

.net中使用Rabbitmq 死信队列 无效

0
悬赏园豆:20 [已解决问题] 解决于 2023-05-09 21:45

需求:消息在队列中超过5s 则发送到死信交换机,然后路由到死信队列,但是没效果,我没找到原因。哪位大佬帮忙看下。Console代码如下:

        //新建ConnectionFactory对象 工厂模式
        var factory = new ConnectionFactory() { HostName = "localhost" };
        //声明死信队列  只需要定义队列的时候 设置队列参数 x-dead-letter-exchange
        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            string normalExchange = "normal_exchange";
            string deadLetterExchange = "dead_exchange";
            string topicQueue1 = "topic_queue1";
            string deadQueue = "dead_queue1";
            string routingKey3 = "lazy.#";

            //声明正常Exchange
            channel.ExchangeDeclare(normalExchange, ExchangeType.Topic, false, false, null);
            //声明死信交换机
            channel.ExchangeDeclare(deadLetterExchange, ExchangeType.Direct, false, false, null);

            //声明队列
            channel.QueueDeclare(topicQueue1, false, false, false, null);
            //channel.QueueDeclare(topicQueue2, false, false, false, null);
            //声明死信队列  已经申明的队列增加参数不会覆盖 需要删除 然后重新申明
            channel.QueueDeclare(deadQueue, false, false, false, null);

            //队列绑定
            //queue1 超过5秒消息则投递到死信交换机
            Dictionary<string, object> properties = new Dictionary<string, object>
            {
                //设置消息过期时间
                { "x-message-ttl", 5000 },
                //绑定死信交换机
                { "x-dead-letter-exchange", deadLetterExchange },
                //设置死信队列RoutingKey
                { "x-dead-letter-routing-key", "dead" }
            };
            channel.QueueBind(topicQueue1, normalExchange, routingKey3, properties);
            channel.QueueBind(deadQueue, deadLetterExchange, "dead", null);


            //生产者推送消息
            string input = string.Empty;
            do
            {
                Console.Write("Send:");
                input = Console.ReadLine();
                var body = Encoding.UTF8.GetBytes(input);
                channel.BasicPublish(normalExchange, "lazy.a", false, null, body);
            } while (input.Trim().ToLower() != "exit");
        }
喜欢写代码的小陈的主页 喜欢写代码的小陈 | 初学一级 | 园豆:5
提问于:2023-05-07 20:57
< >
分享
最佳答案
0

//声明队列
channel.QueueDeclare(topicQueue1, false, false, false, properties);

死信队列绑定错误

收获园豆:20
流逝的一阵风 | 菜鸟二级 |园豆:224 | 2023-05-09 16:40

明白了老哥,应该在申明队列的时候设置参数,不是绑定的时候。感谢老哥。

喜欢写代码的小陈 | 园豆:5 (初学一级) | 2023-05-09 21:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册