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

本文主要是介绍谷粒商城实战笔记-255~256-商城业务-消息队列-SpringBoot整合RabbitMQ,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一,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.10port: 5672virtual-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 处理。

这篇关于谷粒商城实战笔记-255~256-商城业务-消息队列-SpringBoot整合RabbitMQ的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106775

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input