0. 项目结构
rabbitmq04
rabbitmq-provider
rabbitmq-consumer
common
1. 什么是消息回调
消息回调,其实就是消息确认(生产者推送消息成功,消费者接收消息成功)
2. 为什么要进行消息确认
经常会听到丢消息的字眼, 对于程序来说,发送者没法确认是否发送成功,消费者处理失败也无法反馈,
没有消息确认机制,就会出现消息莫名其妙的没了,也不知道什么情况
3. 生产者推送消息[确认]
0.前提:使用直连交换机完成消息的发送和接收
1.在rabbitmq-provider项目的application.yml文件上,添加消息确认的配置项
#1.开启 confirm 确认机制
spring.rabbitmq.publisher-confirms=true
#2.开启 return 确认机制
spring.rabbitmq.publisher-returns=true
#3.设置开启Mandatory,才能触发回调函数,无论消息推送结果怎么样都强制调用回调函数
spring.rabbitmq.template.mandatory=true
server:
port: 8081
servlet:
context-path: /rabbitmq-provider
spring:
rabbitmq:
virtual-host: /
username: guest
password: guest
host: 192.168.186.136
port: 5672
#1.开启 confirm 确认机制
publisher-confirms: true
#2.开启 return 确认机制
publisher-returns: true
#3.设置开启Mandatory,才能触发回调函数,无论消息推送结果怎么样都强制调用回调函数
template:
mandatory: true
注1:设置开启Mandatory,才能触发回调函数,无论消息推送结果怎么样都强制调用回调函数
spring.rabbitmq.template.mandatory=true//此行配置与正面代码效果一样
rabbitTemplate.setMandatory(true);//此行代码也配置项3的效果一致
2.创建RabbitTemplateConfig,在里面创建自定义RabbitTemplate并添加2个相关的回调函数
RabbitTemplate.ConfirmCallback
通过实现ConfirmCallback 接口,消息发送到 Broker 后触发回调,确认消息是否到达 Broker 服务器,也就是只确认是否正确到达 Exchange 中
还需要在配置文件添加配置spring.rabbitmq.publisher-returns=true
package com.lyl.rabbitmqprovider.rabbitmq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @authorlyl
* @site
* @company
* @create 2019-12-27 11:16
*/
@Configuration
@Slf4j
public class RabbitTemplateConfig {
@Bean
public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory, Jackson2JsonMessageConverter jackson2JsonMessageConverter) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(jackson2JsonMessageConverter);//指定json转换器
return rabbitTemplate;
}