docker-rabbitmq
admin/admin
docker run -d --name rabbitmq3.7.7 -p 5672:5672 -p 15672:15672 -v /usr/local/docker/rabbitmq/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin 2888deb59dfc
1.RabbitMQ实现JSON、Map格式数据的发送与接收
1.1 这个转换器要配置的
在发送消息时,它会先将自定义的消息类序列化成json格式,再转成byte构造 Message
1.2 消费者没有替换默认的转换器 map接受报错 Cannot convert from [[B] to [java.util.Map] for GenericMessage
解决办法 在消费者端 也加上JSON转换器
2.SPRINGBOOT之RABBITMQ的序列化转JSON的解决方式
2.1 使用jackson2 对对象进行序列化,默认的序列化是乱码的;
2.2 使用Jackson2后
3.消息确认机制ACK
3.1 RabbitMQ 消费者确认auto 和 manual 模式对异常的处理区别(含重试、requeue的影响)
3.2 开启生产者消息确认
3.2.1 springboot整合rabbitmq实现生产者消息确认、死信交换器、未路由到队列的消息
3.2.2 SpringBoot整合RabbitMq生产者和消费者消息确认机制(ack) 实现接口
1. 如果消息没有到exchange,则confirm回调,ack=false
2. 如果消息到达exchange,则confirm回调,ack=true
3. exchange到queue成功,则不回调return
4. exchange到queue失败,则回调return
3.2.3 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法
3.2.4 通过重写 RabbitTemplate 来加载两个回调方法 和我之前成功的方法是一样的
3.2.5 clean channel shutdown;问题产生在使用的测试方法测试的,当测试方法结束,rabbitmq相关的资源也就关闭了,虽然我们的消息发送出去,但异步的ConfirmCallback却由于资源关闭而出现了上面的问题
Thread.sleep(2000);
3.2.6 生产者功能的实现
1.yml
2.代码
3.3 但是这个时候未配置死信队列,(如果设置了死信队列,就被送到了死信队列;否则直接扔掉)
3.4 消费者消息确认机制(手动/自动)自动确认机制 下的异常处理
3.4.1 可以对可能发生异常的部分try、catch;
只要事先将问题catch住,就证明消费端已经将该问题消费掉,然后该消息就不存在于队列中,不会造成无限报错的情况。这里,你可以在catch中写一些业务,把这个出现异常的“消息”记录到数据库或者怎么怎么处理,反正是相当于被消费掉了。
3.4.2 不使用 try catch的情况下 异常处理 设置 default-requeue-rejected: false 表示 被拒绝的消息 不放回队列中 ,实现只消费一次
#配置rabbitMq 服务器
rabbitmq:
host: 82
port: 5672
username: admin
password: admin
#虚拟host 可以不设置,使用server默认host
virtual-host: my_vhost
listener:
simple:
# 消息确认方式,其有三种配置方式,分别是none、manual(手动ack) 和auto(自动ack) 默认auto
acknowledge-mode: auto
# 为true表示会重新放回队列,如果配置为false表示不会放回队列。 开启重试的时候false 会放到死信队列
default-requeue-rejected: false
#retry:
#重试间隔时间(单位毫秒)
#initial-interval: 5000ms
#是否开启消费者重试(为false时关闭消费者重试,这时消费端代码异常会一直重复收到消息)
#enabled: false
# 最大重试次数 默认3
#max-attempts: 1
5.测试 默认消息自动确认 非手动确认
5.1 ymal 中的配置
rabbitmq: host: 8 port: 5672 username: admin password: admin #虚拟host 可以不设置,使用server默认host virtual-host: my_vhost
5.2 消费这种 设置能被捕获的异常,调用后 发现 该消息只被消费了一次,只报了一次错误
5.3 将错误放到 try catch 之外,异常可以抛出
rabbitmq队列中 消息还存在
unacked的含义 消息未确认
5.4 消费者 抛出异常后 重复消费 的问题优化 yml 中关闭 重试机制 ,设置被拒绝的消费 不放回队列中
#配置rabbitMq 服务器
rabbitmq:
host: 82
port: 5672
username: admin
password: admin
#虚拟host 可以不设置,使用server默认host
virtual-host: my_vhost
listener:
simple:
# 消息确认方式,其有三种配置方式,分别是none、manual(手动ack) 和auto(自动ack) 默认auto
acknowledge-mode: auto
# 处理被拒绝的消息 为true表示会重新放回队列,如果配置为false表示不会放回队列。 开启重试的时候false 会放到死信队列
default-requeue-rejected: false
#retry:
#重试间隔时间(单位毫秒)
#initial-interval: 5000ms
#是否开启消费者重试(为false时关闭消费者重试,这时消费端代码异常会一直重复收到消息)
#enabled: false
# 最大重试次数 默认3
#max-attempts: 1
6.Retry Policy Exhausted RabbitMQ重试机制 缺少死信队列的处理
该配置项是决定由于监听器抛出异常而拒绝的消息是否被重新放回队列。默认值为true。
这个属性的功能才想起来rejected是个形容词,其表示的应该是被拒绝的消息
所以如果该属性配置为true表示会重新放回队列,如果配置为false表示不会放回队列。
8.rabbitmq启动失败_RabbitMQ死信队列在SpringBoot中的使用