RabbitMQ的核心使用示例

我们用 注册成功 → 通过 MQ 异步打印日志 来模拟"发邮件"的场景,这样你就能清晰掌握 MQ 的核心用法了。


1. 生产者(注册成功时发消息)

复制代码
@Service
public class UserService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private UserRepository userRepository;

    public void register(User user) {
        // 1. 保存数据库
        userRepository.save(user);

        // 2. 构造消息
        Map<String, String> msg = new HashMap<>();
        msg.put("email", user.getEmail());

        // 3. 发消息到交换机
        rabbitTemplate.convertAndSend("userExchange", "user.register", msg);

        System.out.println("✅ 用户注册成功,消息已发送到MQ: " + msg);
    }
}

2. 消费者(监听 MQ,打印日志)

复制代码
@Component
public class MailConsumer {

    @RabbitListener(queues = "user.register.queue")
    public void handleRegisterMessage(Map<String, String> msg) {
        String email = msg.get("email");
        // 模拟发送邮件,这里改为打印日志
        System.out.println("📩 异步任务:给 " + email + " 发送欢迎邮件(模拟)");
    }
}

3. 配置(队列 + 交换机绑定)

复制代码
@Configuration
public class RabbitConfig {

    @Bean
    public TopicExchange userExchange() {
        return new TopicExchange("userExchange");
    }

    @Bean
    public Queue userRegisterQueue() {
        return new Queue("user.register.queue");
    }

    @Bean
    public Binding bindingRegisterQueue(Queue userRegisterQueue, TopicExchange userExchange) {
        return BindingBuilder.bind(userRegisterQueue)
                .to(userExchange)
                .with("user.register");
    }
}

🚀 运行流程

  1. 调用注册接口 → 用户入库成功

  2. register() 方法发 MQ 消息 → 控制台打印

    复制代码
    ✅ 用户注册成功,消息已发送到MQ: {email=xxx@qq.com}
  3. 消费者监听到消息 → 异步打印

    复制代码
    📩 异步任务:给 xxx@qq.com 发送欢迎邮件(模拟)

这样整个流程就跑通了:接口快速返回异步处理打印日志,跟发邮件一样的逻辑。

如果出现以下异常:

html 复制代码
Caused by: java.lang.SecurityException: Attempt to deserialize unauthorized class java.util.HashMap; add allowed class name patterns to the message converter or, if you trust the message originator, set environment variable 'SPRING_AMQP_DESERIALIZATION_TRUST_ALL' or system property 'spring.amqp.deserialization.trust.all' to true······

意思是:Spring AMQP 的消息转换器在反序列化消息时,默认启用了 安全白名单机制 ,不允许随便反序列化任意类,防止反序列化攻击。而你现在收到了一个 HashMap 类型的消息,但 HashMap 不在允许反序列化的白名单里,所以直接报错。

在RabbitConfig类里面加上:

java 复制代码
@Bean
    public MessageConverter jacksonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

即可。

相关推荐
初听于你1 小时前
缓存技术揭秘
java·运维·服务器·开发语言·spring·缓存
小蒜学长2 小时前
springboot多功能智能手机阅读APP设计与实现(代码+数据库+LW)
java·spring boot·后端·智能手机
zizisuo5 小时前
解决在使用Lombok时maven install 找不到符号的问题
java·数据库·maven
笨蛋少年派5 小时前
JAVA基础语法
java·开发语言
Haooog6 小时前
654.最大二叉树(二叉树算法)
java·数据结构·算法·leetcode·二叉树
我真的是大笨蛋6 小时前
依赖倒置原则(DIP)
java·设计模式·性能优化·依赖倒置原则·设计规范
邂逅星河浪漫6 小时前
【RabbitMQ】docker-compose编排部署RabbitMQ容器——CentOS
分布式·docker·centos·rabbitmq·docker-compose
东方芷兰6 小时前
JavaWeb 课堂笔记 —— 20 SpringBootWeb案例 配置文件
java·开发语言·笔记·算法·log4j·intellij-idea·lua
Roye_ack7 小时前
【项目实战 Day9】springboot + vue 苍穹外卖系统(用户端订单模块 + 商家端订单管理模块 完结)
java·vue.js·spring boot·后端·mybatis
人间有清欢7 小时前
java数据权限过滤
java·mybatis·权限控制·数据过滤