springboot整合rabbirmq(3.7.9)中使用mandatory参数获取匹配失败的消息以及存入rabbitmq备份交换器中!
先说下这个参数的作用:
/**
* Mandatory为true时,消息通过交换器无法匹配到队列会返回给生产者
* 为false时,匹配不到会直接被丢弃
*/
在一些特定场景下还是有用处的!
接下来说一下绑定队列与交换器,需要在配置类或者xml中提前配置好
尤其是queue,如果同时写了消费者,必须先配置好bean,即mq中队列必须存在,不然会报错
//创建消息队列
@Bean
public Queue testQueue(){
//boolean表示消息是否持久化
return new Queue("testQueue",true);
}
//创建交换器
@Bean
public DirectExchange exchange(){
//boolean表示消息是否持久化
return new DirectExchange("exchange");
}
//通过指定key绑定队列与交换器
@Bean
Binding bindingExchangeMessages(@Qualifier("testQueue") Queue queue, DirectExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("routeKey");
}
绑定好之后就可以测试这个参数了,使用我们指定的交换器和key!
程序启动之后会自动创建,这里如果需要捕获匹配失败的消息需要添加一个监听器
测试:当参数设置为true时,写个错误的key:

@Override
public void sendTest() {
/**
* Mandatory为true时,消息通过交换器无法匹配到队列会返回给生产者
* 为false时,匹配不到会直接被丢弃
*/
rabbitTemplate.setMandatory(true);
//添加监听器获取返送失败的消息
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
System.out.println("replyCode:"+replyCode);
System.out.println("replyText:"+replyText);
System.out.println("匹配队列失败,返回消息:" + message.toString());
}
});
// 向指定交换器发送消息,需要key
rabbitTemplate.convertAndSend("exchange","route","测试消息内容");
}
由于key不对,匹配队列失败,参数为true,所以消息会返回给生产者:

如果写上正确key,则正常发送接受,如果
setMandatory
设置为false,则匹配不到的消息直接被丢弃!
还可以直接使用备份交换器更方便!
只要配置即可,注意,这里如果之前配置错了,要么重新删除交换器,要么解绑,否则不起作用
配置:
//备份交互器
@Bean
public FanoutExchange unrouteExchange(){
return new FanoutExchange("unrouteExchange",true,false);
}
//创建备份交互器与备份交互器队列
@Bean
public Queue unrouteQueue(){
return new Queue("unrouteQueue",true);
}
//绑定备份交互器与备份队列,不需要指定key
@Bean
Binding bindingUnRouteExchangeMessages() {
return BindingBuilder.bind(unrouteQueue()).to(unrouteExchange());
}
//创建消息队列
@Bean
public Queue testQueue(){
//boolean表示消息是否持久化
return new Queue("testQueue",true);
}
//创建交换器
@Bean
public DirectExchange exchange(){
// 指定此交换器的备份交互器,存储没有被路由的消息
Map<String, Object> args = new HashMap<>();
args.put("alternate-exchange", "unrouteExchange");
return new DirectExchange("exchange",true,false,args);
} //通过指定key绑定队列与交换器
@Bean
Binding bindingExchangeMessages() {
return BindingBuilder.bind(testQueue()).to(exchange()).with("routeKey");
}
此时再测试会发现消息进入了备份队列:

这里有个坑点,如果配置错了,即交换器不存在或者交互器没有绑定队列,不会报错,消息会直接丢失
我之前这里就是配置交互器名称写成了队列的名称,所以消息一直丢失,搞了大半天!!!!一定要认真!
springboot整合rabbirmq(3.7.9)中使用mandatory参数获取匹配失败的消息以及存入rabbitmq备份交换器中!的更多相关文章
- RabbitMQ Queue中Arguments属性参数过期队列,过期消息,超时队列的声明
开发十年,就只剩下这套Java开发体系了 >>> 创建队列时指定参数 队列属性:x-message-ttl 可以控制被publish到queue中的message 被丢弃前能够存 ...
- getUrlParam,jQuery中的URL参数获取
大家经常会需要在一段URL中截取到自己所需参数的值,下面的方法也许能帮到您: $.getUrlParam = function(name){ var reg = new RegExp("(^ ...
- Linux中执行脚本参数获取
Linux中变量$[#,@,0,1,2,*,$,?]含义 $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $ ...
- springboot整合Shiro功能案例
Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...
- springboot整合elasticJob实战(纯代码开发三种任务类型用法)以及分片系统,事件追踪详解
一 springboot整合 介绍就不多说了,只有这个框架是当当网开源的,支持分布式调度,分布式系统中非常合适(两个服务同时跑不会重复,并且可灵活配置分开分批处理数据,贼方便)! 这里主要还是用到zo ...
- springboot整合rabbitmq实现生产者消息确认、死信交换器、未路由到队列的消息
在上篇文章 springboot 整合 rabbitmq 中,我们实现了springboot 和rabbitmq的简单整合,这篇文章主要是对上篇文章功能的增强,主要完成如下功能. 需求: 生产者在启 ...
- SpringBoot整合RabbitMQ实践教程
1. MQ MQ(Message Queue),消息队列,是生产者和消费者模型中传递信息的容器,主要用于线程或进程之间通信. MQ主要的应用场景为:应用解耦.异步处理,流量削锋,日志处理等. ...
- 基于springboot整合的rabbitmq
技术:springboot1.5.2 + maven3.0.5 + rabbitmq3.7.13 + jdk1.8 概述 RabbitMQ是对高级消息队列协议(Advanced Message Q ...
- struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)
我的前台页是这样的: <body> <form action="test.action" method="post"> ...
随机推荐
- 《Linux内核设计与实现》学习记录一
chapter1 Linux内核简介 前言:Unix是一个具有相似应用程序编程接口(API)并且基于相似设计理念的操作系统家族. 1.1 Unix的历史 1.Unix演化版实现了任务管理.换页机制.T ...
- Github: 团队账号:https://github.com/ChenRuTing
Github: 团队账号:https://github.com/ChenRuTing 以后我们做好的代码会随时更新上传到这里,请老师届时帮我们看看.谢谢老师.
- Alpha冲刺——day9
Alpha冲刺--day9 作业链接 Alpha冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602634 ...
- Linux命令(二) 复制文件 cp
cp命令用来复制文件或目录,当复制多个文件时,目标文件参数必须为已经存在的目录,否则将出现错误. cp命令默认不能复制目录,复制目录必须使用 -R 选项.cp命令具备了 ln命令的功能. 命令格式: ...
- Git合并的代码 不提交服务器的方法
使用Git下载代码的时候,常遇到合并的情况,然后再上传的时候,系统就会自动把合并代码的过程也上传,有时候会感觉非常的烦Merge remote-tracking branch 'choose_remo ...
- HGOI20180812 (NOIP2018 提高组 Day1 模拟试题)
前缀数组其实就是有序的,那么答案显然是 我们尝试求出通项公式: 证明如下: 因为 所以: 解之得: 更加通俗的写法如下: 易知 令 那么, (错位相减) 由易知等式代入得, 所以, 所以程 ...
- 【bzoj3569】 DZY Loves Chinese II
http://www.lydsy.com/JudgeOnline/problem.php?id=3569 (题目链接) 题意 给出一个无向图,$Q$组询问,每次询问将原图断掉$C$条边后是否还连通.在 ...
- BZOJ 4720 [Noip2016]换教室
4720: [Noip2016]换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i( ...
- springboot的日志框架slf4j (使用logback输出日志以及使用)
1.为什么使用logback? ——在开发中不建议使用System.out因为大量的使用会增加资源的消耗.因为使用System.out是在当前线程执行的,写入文件也是写入完毕之后才继续执行下面的程序. ...
- Ubuntu下安装BeautifulSoup4
先去下载beautifulsoup的安装包https://www.crummy.com/software/BeautifulSoup/bs4/download/4.0/ 下载完之后解压 tar -xv ...