RabbitMQ-死信交换机和死信队列

1. 简介

DLX: Dead-Letter-Exchange 死信交换器,死信邮箱

2.代码示例

java 复制代码
@Configuration
public class RabbitConfig {
    final static String exchangeNormalName = "exchange.dlx.normal";
    final static String queueNormalName = "queue.dlx.normal";
    final static String exchangeDeadName = "exchange.dlx.dead";
    final static String queueDeadName = "queue.dlx.dead";


    //正常交换机
    @Bean
    public DirectExchange normalExchange(){
        return ExchangeBuilder.directExchange(exchangeNormalName).build();
    }
    //正常队列
    @Bean
    public Queue normalQueue(){
        Map<String, Object> map = new HashMap<>();
        map.put("x-message-ttl", 20000);//设置20s的过期时间
        map.put("x-dead-letter-exchange", exchangeDeadName);//设置死信交换机名字
        map.put("x-dead-letter-routing-key", "error");//设置死信交换机路由k
        return QueueBuilder.durable(queueNormalName)
                .withArguments(map)
                .build();
    }

    @Bean
    public Binding normalBinding(DirectExchange normalExchange, Queue normalQueue){
        return BindingBuilder.bind(normalQueue).to(normalExchange).with("order");
    }


    //死信交换机
    @Bean
    public DirectExchange dlxExchange(){
        return ExchangeBuilder.directExchange(exchangeDeadName).build();
    }
    //死信队列
    @Bean
    public Queue dlxQueue(){
        return QueueBuilder.durable(queueDeadName).build();
    }

    @Bean
    public Binding dlxBinding(DirectExchange dlxExchange, Queue dlxQueue){
        return BindingBuilder.bind(dlxQueue).to(dlxExchange).with("error");
    }

}

如上,设置普通交换机把过期内容放置到死信交换机中去。最重要的几行代码

java 复制代码
		map.put("x-message-ttl", 20000);//设置20s的过期时间
        map.put("x-dead-letter-exchange", exchangeDeadName);//设置死信交换机名字
        map.put("x-dead-letter-routing-key", "error");//设置死信交换机路由k

3.测试结果

经过20s之后,如下,将普通队列的信息放入死信队列中

其中TTL代表x-message-ttl,DLX代表x-dead-letter-exchange,DLK代表x-dead-letter-routing-key

4.单条消息

上方是将整个队列设置过期时间,也可以将单条消息设置过期时间,即不给整个队列设置过期时间

java 复制代码
		//map.put("x-message-ttl", 20000);//设置20s的过期时间
        map.put("x-dead-letter-exchange", exchangeDeadName);//设置死信交换机名字
        map.put("x-dead-letter-routing-key", "error");//设置死信交换机路由k

而是在消息体中设置过期时间

java 复制代码
@Component
@Slf4j
public class MessageService {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    public void senMsg() throws InterruptedException {

        //定义消息
        String msg="单条消息过期时间test";
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setExpiration("10000"); //10s
        Message message= MessageBuilder.withBody(msg.getBytes()).andProperties(messageProperties).build();
        //发消息
        rabbitTemplate.convertAndSend("exchange.dlx.normal","order",message);
        log.info("消息发送完毕,发送时间为:{}", new Date());
    }
}
相关推荐
超级小忍1 分钟前
从零开始:JDK 在 Windows、macOS 和 Linux 上的下载、安装与环境变量配置
java·windows·macos
.鸣9 分钟前
Java学习笔记:IDEA简单使用技巧
java·学习
2501_9167665413 分钟前
【IDEA2017】使用设置+创建项目的不同方式
java·intellij-idea
kyle~13 分钟前
C++---多态(一个接口多种实现)
java·开发语言·c++
funfan051716 分钟前
IDEA基础配置优化指南(中英双版)
java·ide·intellij-idea
罗小爬EX17 分钟前
在IDEA中设置新建Java类时自动添加类注释
java·intellij-idea
Java小混子19 分钟前
【Redis】缓存和分布式锁
redis·分布式·缓存
vvilkim33 分钟前
深入理解 Spring Boot Starter:简化依赖管理与自动配置的利器
java·前端·spring boot
柯南二号40 分钟前
【Java后端】【可直接落地的 Redis 分布式锁实现】
java·redis·分布式
1点东西1 小时前
新来的同事问我当进程/机器突然停止时,finally 到底会不会执行?
java·后端·程序员