热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Springboot2.3.7.RELEASE结合amqp实现RabbitMQ的direct模式(路由模式)

参考《SpringBoot实战派》消息队列RabbitMQ入门与5种模式详解(讲解了用户权限的问题,可以看一看)springboot(集成篇):RabbitMQ集成详解必看如果要发

参考

  1. 《Spring Boot实战派》
  2. 消息队列RabbitMQ入门与5种模式详解(讲解了用户权限的问题,可以看一看)
  3. springboot(集成篇):RabbitMQ集成详解

必看

  • 如果要发送对象,发送的对象需要继承 Serializable
  • 可以创建多个消费者,消息会均匀的分配给消费者
    Springboot 2.3.7.RELEASE 结合 amqp 实现 RabbitMQ 的 direct 模式(路由模式)
  • 任务失败后会自动重试,建议自己处理一下这方面的问题

建议

  • RabbitMQ 有多种模式及相关配置这里不再描述,建议搜索了解一下;本文只介绍 direct 模式的实现。
  • 关于Windows下的安装及开启web管理面板可以参考一下 【2021/11/28 基于RabbitMQ3.9.10】Windows安装RabbitMQ,并解决远程登录guest账号提示User can only log in via localhost 的问题

环境

  • Springboot 2.3.7.RELEASE
  • amqp(pom.xml内添加,未设置具体版本)
  • otp_win64_24.1.7(win安装文件)
  • rabbitmq-server-3.9.10(win安装文件)

正文

  1. pom.xml添加依赖

        
            org.springframework.boot
            spring-boot-starter-amqp
        

  1. 创建配置类、声明队列并绑定队列
/**
 * 配置mq交换器及声明队列
 * @Author 夏秋初
 * @Date 2021/11/27 19:48
 */
@Configuration
public class RabbitConfig {
    /**
     * 声明email队列
     * @return
     */
    @Bean
    public Queue userEmailVerify() {
        // true表示持久化该队列
        return new Queue("user.email.verify", true);
    }

//    /**
//     * 声明交互器 topic
//     * @return
//     */
//    @Bean
//    TopicExchange topicExchange() {
//        return new TopicExchange("topicExchange");
//    }
    /**
     * 声明交互器/交换机 direct
     * @return
     */
    @Bean
    DirectExchange directExchange() {
        return new DirectExchange("direct.exchange");
    }

    /**
     * 绑定email队列,并设置路由key,如果还有别的队列,再创建一个函数绑定即可
     * @return
     */
    @Bean
    public Binding bindingUserEmailVerify() {
        return BindingBuilder.bind(userEmailVerify()).to(directExchange()).with("user.email.verify");
    }
}
  1. 创建生产者(书上说可以发送对象,这边测试会报错不支持的格式,待文章写完后再解决)

/**
 * 发送者
 * @Author 夏秋初
 * @Date 2021/11/27 19:54
 */
@Component
public class UserEmailVerifyProducer {
    @Resource
    private AmqpTemplate amqpTemplate;
    /**
     * 发送邮件队列
     * @param userVerificationCodeEmailDto
     */
    public void sendEmail(UserEmailVerifyDto userVerificationCodeEmailDto){
        System.out.println("生产者 user.email.verify 发送消息: "+userVerificationCodeEmailDto);
        /**
         * 第一个参数指定交换机
         * 第二个参数指定队列
         * 第三个参数指定消息内容
         */
        amqpTemplate.convertAndSend("direct.exchange", "user.email.verify", userVerificationCodeEmailDto.toString());

    }
}

  1. 创建消费者
/**
 * 消费者
 * @Author 夏秋初
 * @Date 2021/11/27 20:23
 */
@Component
// 监听指定队列 
@RabbitListener(queues = "user.email.verify")
public class UserEmailVerifyConsumer {
    @RabbitHandler
    public void process(String content){
            System.out.println("消费者 user.email.verify  收到消息: "+content
        );
    }
}
  1. 用户实体
/**
 * @Author 夏秋初
 * @Date 2021/11/27 20:00
 */
@Data
public class UserEmailVerifyDto implements Serializable {
    private String email;
    private Integer code;
    private String cOntent= "您的邮箱验证码为:%d,请不要告诉别人哦";
}

  1. application.properties 配置文件内添加配置参数
# 如果访问局域网的mq服务,需要配置账户并允许远程访问 ,参考:https://www.cnblogs.com/xiaqiuchu/p/15616432.html
spring.rabbitmq.host=192.168.211.2
# 指定端口号
spring.rabbitmq.port=5672
# 指定账号,默认账号不可以在其他机器登录
spring.rabbitmq.username=testmail
# 指定密码
spring.rabbitmq.password=testmail

测试

  1. 运行本项目
  2. 访问控制台可以看到该交换机
    Springboot 2.3.7.RELEASE 结合 amqp 实现 RabbitMQ 的 direct 模式(路由模式)
  3. 点击进入交换机详情可以看到交换机内部的队列
    Springboot 2.3.7.RELEASE 结合 amqp 实现 RabbitMQ 的 direct 模式(路由模式)
  4. 测试发送消息显示消费者接受到
    Springboot 2.3.7.RELEASE 结合 amqp 实现 RabbitMQ 的 direct 模式(路由模式)

推荐阅读
  • RabbitMQ的消息持久化处理
    1、RabbitMQ的消息持久化处理,消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢——消息持久化。2、auto ... [详细]
  • RabbitMq之发布确认高级部分1.为什么会需要发布确认高级部分?在生产环境中由于一些不明原因,导致rabbitmq重启,在RabbitMQ重启期间生产者消息投递失败,导致消息丢 ... [详细]
  • 讨伐Java多线程与高并发——MQ篇
    本文是学习Java多线程与高并发知识时做的笔记。这部分内容比较多,按照内容分为5个部分:多线程基础篇JUC篇同步容器和并发容器篇线程池篇MQ篇本篇 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • java线程池的实现原理源码分析
    这篇文章主要介绍“java线程池的实现原理源码分析”,在日常操作中,相信很多人在java线程池的实现原理源码分析问题上存在疑惑,小编查阅了各式资 ... [详细]
  • rabbitmq杂谈
    rabbitmq中的consumerTag和deliveryTag分别是干啥的,有什么用?同一个会话,consumerTag是固定的可以做此会话的名字,deliveryTag每次接 ... [详细]
  • 消息中间件RabbitMQ 高级特性之消费端ACK与重回队列
    什么是消费端的ACK和重回队列?消费端的手工ACK和NACK消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿如果由于服务器宕机等严重问题 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
author-avatar
Smitty
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有