rabbitmq TTL和私信队列

本文介绍了如何使用RabbitMQ创建死信交换机和队列,通过设置消息存活时间(TTL)和死信交换机,实现消息的延迟处理。当消息过期后,它们会自动路由到死信队列,供消费者监听和消费。示例代码展示了生产者发送带有时限的消息以及消费者从死信队列接收并确认消息的过程。
摘要由CSDN通过智能技术生成

在这里插入图片描述
实际应用中,我们都会按照时间段划分等级,例如为5 秒、30 秒、5 分钟、30 分钟、1 小时。。。。。。如下图,我们只画了三个队列,中间的时间省略了。生产者发消息时携带有时间标识的路由键,然后交换机将消息路由到对应的消息过期时间的队列上,这些队列分别绑定了死信交换机,这些死信交换机又分别绑定了死信队列,消息过期后就通过死信交换机路由到了死信队列上面,然后我们的消费者就可以监听消费死信队列上面的消息了。

注意:下面图示中多个死信交换机分别绑定了队列,这样是为了更好的区分不同时间的消息,方便处理、查看、统计、监控等,当然也可以多个死信交换机绑定同一个队列。
在这里插入图片描述

package com.wfg.ttl;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.MessageProperties;
import com.wfg.util.MQUtils;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

/**
 * @author wufagang
 * @description
 * @date 2021年05月23日 5:08 下午
 */
public class Produce {
    public static void main(String[] args) throws Exception {
        Channel channel = MQUtils.getChannel();
        //声明一个交换机,做死信交换机用
        channel.exchangeDeclare("delay_exchange_5s", "direct", true, false, null);
        //声明一个队列,做死信队列用
        channel.queueDeclare("delay_queue_5s", true, false, false, null);
        //队列绑定到交换机上
        channel.queueBind("delay_queue_5s", "delay_exchange_5s", "q5s");

        channel.exchangeDeclare("work_exchange", "direct", true, false, null);
        Map<String, Object> arguments=new HashMap<String, Object>();
        arguments.put("x-message-ttl" , 5000);//设置消息有效期1秒,过期后变成私信消息,然后进入DLX
        arguments.put("x-dead-letter-exchange" , "delay_exchange_5s");//设置DLX
        //为队列normal_queue 添加DLX
        channel.queueDeclare("work_queue_5s", true, false, false, arguments);
        channel.queueBind("work_queue_5s", "work_exchange", "q5s");

        String message = LocalDateTime.now() +",延迟五秒的消息";
        channel.basicPublish("work_exchange", "q5s", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
        System.out.println("发送消:"+message);

        channel.close();
    }
}

package com.wfg.ttl;

import com.rabbitmq.client.*;
import com.wfg.util.MQUtils;

import java.io.IOException;
import java.time.LocalDateTime;

/**
 * @author wufagang
 * @description
 * @date 2021年05月23日 5:07 下午
 */
public class Constomer {

    public static void main(String[] args) throws Exception {
        final Channel channel = MQUtils.getChannel();

        channel.exchangeDeclare("delay_exchange_5s", "direct", true, false, null);
        channel.queueDeclare("delay_queue_5s", true, false, false, null);
        channel.queueBind("delay_queue_5s", "delay_exchange_5s", "q5s");

        // 指该消费者在接收到队列里的消息但没有返回确认结果之前,它不会将新的消息分发给它。
        channel.basicQos(1);

        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
                    throws IOException {
                System.out.println("消费者收到消息:" + new String(body)+",当前时间:"+ LocalDateTime.now());
                // 消费者手动发送ack应答
                channel.basicAck(envelope.getDeliveryTag(), false);
            }
        };
        System.out.println("消费延迟5秒队列中的消息======================");
        // 监听队列
        channel.basicConsume("delay_queue_5s", false, consumer);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
私信队列RabbitMQ中的一种特殊队列,用于处理无法被消费者处理或处理失败的消息。当消息在被消费者拒绝后,可以通过私信队列重新发送给特定的消费者进行处理。私信队列的实现方式是通过死信机制来实现的。 在RabbitMQ中,通过将一个队列绑定到一个特定的死信交换机上,当消息在原队列中被拒绝、过期或达到最大重试次数时,就会被发送到私信队列中。这样,我们可以对私信队列进行单独的处理,例如记录日志、发送通知等。 为了实现私信队列,我们可以设置消息的过期时间,并将队列绑定到一个死信交换机上。当消息过期后,它会被路由到死信交换机,然后再路由到私信队列,供消费者处理。通过这种方式,我们可以很好地处理那些无法被正常消费的消息,确保消息的可靠性和稳定性。 总之,私信队列是通过RabbitMQ死信机制来实现的,用于处理无法被消费者处理或处理失败的消息。它是一种非常有用的机制,可以帮助我们解决消息消费中的异常情况,并提高消息处理的可靠性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring RabbitMQ死信机制原理实例详解](https://download.csdn.net/download/weixin_38500948/12742891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【二】RabbitMQ基础篇(延迟队列死信队列实战)](https://blog.csdn.net/weixin_56995925/article/details/123711256)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [rabbitmq TTL私信队列](https://blog.csdn.net/wufagang/article/details/117197627)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值