谷粒商城实战笔记-255~256-商城业务-消息队列-SpringBoot整合RabbitMQ

news2024/11/14 16:35:07

文章目录

  • 一,Spring整合RabbittMq的步骤
  • 二,AmqpAdmin使用
    • 1. `createExchange()`
    • 2. `testCreateQueue()`
    • 3. `createBinding()`
    • 4,发送消息

这一部分讲解Spring整合RabbitMq的步骤及其使用,包括:

  • 255-商城业务-消息队列-SpringBoot整合RabbitMQ
  • 256-商城业务-消息队列-AmqpAdmin使用
  • 257-商城业务-消息队列-RabbitTemplate使用

一,Spring整合RabbittMq的步骤

以下是基于这些信息的Spring整合RabbitMQ的步骤:

  1. 引入amqp场景:为了使用RabbitMQ,首先需要在项目中引入AMQP相关的依赖。如果你正在使用Maven或Gradle作为构建工具,你需要添加相应的RabbitMQ客户端库和Spring AMQP库到你的pom.xml(对于Maven)文件。
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
  1. 自动配置:当引入了AMQP场景后,Spring Boot会自动加载RabbitAutoConfiguration类进行自动配置。这个过程将为容器创建以下组件:

    • RabbitTemplate:用于发送消息到RabbitMQ。
    • AmqpAdmin:提供了一些管理功能,如创建队列、交换机等。
    • CachingConnectionFactory:连接工厂,负责建立与RabbitMQ服务器的连接,并缓存它们以提高性能。
    • RabbitMessagingTemplate:提供了更高级的消息发送功能。
  2. 属性配置:所有的属性都通过@ConfigurationProperties(prefix = "spring.rabbitmq")注解进行配置。这意味着你可以通过在application.properties或application.yml文件中定义spring.rabbitmq.*前缀的属性来设置RabbitMQ的相关参数。

    spring:
      rabbitmq:
        host: 192.168.56.10
        port: 5672
        virtual-host: /
    
  3. 启用RabbitMQ支持:使用@EnableRabbit注解,把注解加载启动类上。

@EnableRabbit

在这里插入图片描述

二,AmqpAdmin使用

我们通过单元测试来试用RabbitmMq的Java客户端。

这三个方法都是测试方法,分别用于创建交换机、队列以及绑定关系。下面是每个方法的具体作用:

1. createExchange()

@Test
public void createExchange() {

    Exchange directExchange = new DirectExchange("hello-java-exchange", true, false);
    amqpAdmin.declareExchange(directExchange);
    log.info("Exchange[{}]创建成功:", "hello-java-exchange");
}
  • 作用: 创建一个名为 hello-java-exchange 的Direct类型的交换机。
  • 细节:
    • new DirectExchange("hello-java-exchange", true, false) 创建了一个Direct类型的交换机实例,其中 "hello-java-exchange" 是交换机的名称,true 表示它是持久化的(即使RabbitMQ重启后也不会丢失),false 表示它不是自动删除的(即不会在最后一个绑定到它的队列被删除后自动删除)。
    • amqpAdmin.declareExchange(directExchange) 使用 AmqpAdmin 实例的 declareExchange 方法来声明(创建)交换机。
    • log.info("Exchange[{}]创建成功:", "hello-java-exchange") 记录一条信息,表示交换机创建成功。

2. testCreateQueue()

@Test
public void testCreateQueue() {
    Queue queue = new Queue("hello-java-queue", true, false, false);
    amqpAdmin.declareQueue(queue);
    log.info("Queue[{}]创建成功:", "hello-java-queue");
}
  • 作用: 创建一个名为 hello-java-queue 的队列。
  • 细节:
    • new Queue("hello-java-queue", true, false, false) 创建了一个队列实例,其中 "hello-java-queue" 是队列的名称,true 表示它是持久化的,第一个 false 表示它不是独占的(独占队列只能被创建它的连接访问),第二个 false 表示它不是自动删除的(即不会在消费者断开连接后自动删除)。
    • amqpAdmin.declareQueue(queue) 使用 AmqpAdmin 实例的 declareQueue 方法来声明(创建)队列。
    • log.info("Queue[{}]创建成功:", "hello-java-queue") 记录一条信息,表示队列创建成功。

3. createBinding()

@Test
public void createBinding() {

    Binding binding = new Binding("hello-java-queue",
            Binding.DestinationType.QUEUE,
            "hello-java-exchange",
            "hello.java",
            null);
    amqpAdmin.declareBinding(binding);
    log.info("Binding[{}]创建成功:", "hello-java-binding");

}
  • 作用: 创建一个绑定关系,将队列 hello-java-queue 绑定到交换机 hello-java-exchange 上。
  • 细节:
    • new Binding("hello-java-queue", Binding.DestinationType.QUEUE, "hello-java-exchange", "hello.java", null) 创建了一个绑定实例,指定了队列 "hello-java-queue" 作为目的地类型 (Binding.DestinationType.QUEUE),交换机 "hello-java-exchange" 作为来源,路由键 "hello.java",以及没有额外的绑定参数。
    • amqpAdmin.declareBinding(binding) 使用 AmqpAdmin 实例的 declareBinding 方法来声明(创建)绑定。
    • log.info("Binding[{}]创建成功:", "hello-java-binding") 记录一条信息,表示绑定创建成功。

4,发送消息

这段代码通过RabbitMQ发送一个消息。

  1. 创建消息实体:

    OrderReturnReasonEntity reasonEntity = new OrderReturnReasonEntity();
    reasonEntity.setId(1L);
    reasonEntity.setCreateTime(new Date());
    reasonEntity.setName("reason");
    reasonEntity.setStatus(1);
    reasonEntity.setSort(2);
    
    • 这几行代码创建了一个 OrderReturnReasonEntity 类型的对象,并设置了它的属性。这个对象将作为消息发送到RabbitMQ。
  2. 发送消息:

rabbitTemplate.convertAndSend("hello-java-exchange", "hello2.java",
        reasonEntity, new CorrelationData(UUID.randomUUID().toString()));
  • rabbitTemplate 是一个实现了 RabbitTemplate 接口的对象,通常由Spring框架自动配置。

  • convertAndSend 方法用于发送消息。它有四个参数:

    • "hello-java-exchange" 是交换机的名称。
    • "hello2.java" 是路由键(routing key)。
    • reasonEntity 是要发送的消息体。
    • new CorrelationData(UUID.randomUUID().toString()) 是一个关联数据(CorrelationData),用于跟踪消息的状态。这里使用UUID生成了一个唯一标识符。
  • 在发送消息之前,rabbitTemplate 会自动将 reasonEntity 对象转换为字节流,通常使用JSON序列化的方式。因此,reasonEntity 必须实现 Serializable 接口或者能够被序列化工具如 Jackson 或 Gson 处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tita的OKR :产品经理的OKR

产品经理制定的OKR&#xff0c;对组织发展有重大的意义&#xff0c;它能促使产品经理&#xff0c;产品团队&#xff0c;乃至是公司全体员工走出舒适区&#xff0c;超越能力边界。正因为挑战的存在&#xff0c;才使得产品经理才有忧患意识&#xff0c;不断改进产品&#xff0c;从…

【操作系统】10.虚拟内存管理有什么不同?

2.虚拟内存管理有什么不同&#xff1f; 2.1 虚拟内存的基本概念 虚拟内存的概念 具有请求调入和置换功能&#xff0c;从逻辑上对内存容量加以扩充的一种存储器系统 局部性原理 时间局部性 空间局部性 虚拟内存的特征 多次性 对换性 虚拟性 2.1.1 虚拟内存的实现 请求分页存储管…

了解一点电池的工作原理,让它们更好地为我们工作。【手机充电小技巧】(影响电池寿命的主要因素:过充、过放以及高温)

文章目录 引言I 充电小技巧,充分发挥电池性能随充随用都行充电时移除某些保护壳不正常的持续发烫,建议停止充电及时拔掉充电器或者关闭插座电源长期存放时,请保持一半电量。电池健康自动管理II 电池的工作原理快充为便捷,慢充保寿命。锂离子电池以充电周期方式工作,让充电更…

网络层 I(网络层的功能)【★★★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、 路由与转发&#xff08;★★&#xff09; 路由器主要完成两个功能&#xff1a; 1. 路由选择 【&#xff08;确定哪一条路径&#xff09;根据路由选择协议构…

从零开始搭建Aliyun ESC高可用集群 (HaVip+KeepAlived)

从零开始搭建Aliyun ESC高可用集群 (HaVip+KeepAlived) 架构 架构 本设计方案采用两台阿里云ECS服务器搭建Keepalived结合LVS的高可用集群。使用LVS的TUN模式进行负载均衡,同时利用阿里云的弹性IP(EIP)与高可用虚拟HaVIP实现跨服务器的高可用性。架构中,一台ECS服务器作为…

一文彻底理解大模型 Agent 智能体原理和案例

1 什么是大模型 Agent &#xff1f; 大模型 Agent&#xff0c;作为一种人工智能体&#xff0c;是具备环境感知能力、自主理解、决策制定及执行行动能力的智能实体。简而言之&#xff0c;它是构建于大模型之上的计算机程序&#xff0c;能够模拟独立思考过程&#xff0c;灵活调…

防火墙基础概念与实验配置

目录 1.防火墙简介 1.1 什么是防火墙&#xff1f; 1.2 防火墙的功能 1.3 防火墙的类型 2.防火墙配置实验 2.1 基本要求 2.2 实验top 3.实验配置 3.1 基础配置 3.1.1 基础配置 3.1.2 安全域配置 3.1.3 配置安全策略 3.1.4 配置NAT 3.1.5 trust->dmz 3.1.6 端口…

代码随想录算法训练营day27 | 贪心算法 | 455.分发饼干、376.摆动序列、53.最大子序和

文章目录 理论基础解题步骤455.分发饼干思路小结 376.摆动序列简单思路贪心思路 53.最大子序和思路 今天是贪心算法的第一天 理论基础 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优 在理论上&#xff0c;能使用贪心解决的问题有两个特点&#xff1a;具有…

buuctf [HDCTF2019]Maze

前言&#xff1a;做题笔记。 常规 下载 解压 查壳 脱壳后用32IDA Pro打开。 得&#xff0c;迷宫类型的题目。(字符串有说。) 咳&#xff0c;此前思路对半分不行了。。。 合理猜测步数为&#xff1a;14。 那可以看看7 * 10的迷宫类型。(手动猜测的时候去取倍数如&#xff1a;0 2…

什么牌子的蓝牙耳机性价比高?2024年四款最值得买王牌耳机推荐!

在当前的手机备件市场中&#xff0c;蓝牙耳机已经逐渐成为智能手机备件的热门之选。然而&#xff0c;面对众多的耳机品牌和型号&#xff0c;消费者在选购时可能会感到困惑&#xff0c;稍微不留言就会买到不专业产品&#xff0c;那么什么牌子的蓝牙耳机性价比高&#xff1f;作为…

STM32的串口通信——HAL库

TTL串口 TTL串口仅仅需要两根数据线就可以进行串口通信&#xff1a; ①一条是从A设备发送的IO口连接到B设备的接收IO口 ②一条是从B设备发送的IO口连接到A设备的接收IO口 ③共地&#xff08;GND&#xff09;是两个设备通信的前提&#xff08;保证他们的电平标准一致&#x…

使用css如何获取最后一行的元素?使用css解决双边框问题

一、项目场景&#xff1a; 在小程序上需要实现一个如下图的ui效果图 需要满足以下条件 一行放不下 自动换行最后一行或者只有一行时&#xff0c;文字底部不能有线 二、初版实现 按照上面的要求&#xff0c;最开是的实现代码如下 我是给每一个元素都添加了一个下边框&#x…

Python酷库之旅-第三方库Pandas(095)

目录 一、用法精讲 406、pandas.DataFrame.index属性 406-1、语法 406-2、参数 406-3、功能 406-4、返回值 406-5、说明 406-6、用法 406-6-1、数据准备 406-6-2、代码示例 406-6-3、结果输出 407、pandas.DataFrame.columns属性 407-1、语法 407-2、参数 407-3…

楼顶气膜羽毛球馆:城市健身新空间—轻空间

随着城市化进程的加快&#xff0c;城市土地资源愈发紧张&#xff0c;如何高效利用有限的空间成为一大挑战。楼顶气膜羽毛球馆作为一种创新的体育场馆建设方式&#xff0c;凭借其独特的优势&#xff0c;逐渐成为城市健身的新宠。它不仅有效利用了楼顶闲置空间&#xff0c;还为市…

新160个crackme - 039-eKH.1

运行分析 需要破解Name和Serial&#xff0c;写出注册机 PE分析 - Delphi程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida搜索关键字符串&#xff0c;跳转到关键代码 静态分析&#xff0c;修改变量如上&#xff0c;关键在于sub_427A20函数返回值需要大于等于1…

“双指针”算法下篇

WeChat_20240806081335 对双指针这一思想在OJ 里面的相关应用&#xff0c;感兴趣的友友们&#xff0c;可以看下此篇博客 https://blog.csdn.net/X_do_myself/article/details/141291451?spm1001.2014.3001.5502 目录 一盛最多水的容器 1题目链接&#xff1a;盛最多水的容器…

EmguCV学习笔记 VB.Net 6.5 凸包和凸缺陷

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

sgsegse

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

货车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

货车制造5G智能工厂工业物联数字孪生平台&#xff0c;推进制造业数字化转型。随着5G技术的飞速发展与工业物联网的深度融合&#xff0c;货车制造5G智能工厂工业物联数字孪生平台应运而生&#xff0c;它不仅重新定义了生产模式&#xff0c;更以强大的技术驱动力&#xff0c;推动…

开放世界目标检测:检测区分出未知物体

开放世界目标检测&#xff1a;检测区分出未知物体 01 Abstract 开放世界目标检测旨在识别未见过类别的目标&#xff0c;并在提供注释后逐步识别这些目标。与传统的只限于预定义类别的范式不同&#xff0c;这种设置承诺通过使用与类别无关的信息来持续且通用地估计目标性。然而…