使用 RabbitMQ 进行消息传递

RabbitMQ消息传递流程 两个新名词 本篇文章以上篇文章《Rabbit的基础概念》为基础,且在上篇文章的前提下又引入了两个新的概念: 连接( Connection) 我们知道绝大部分的通信都是基于网络协议的,其中TCP协议就是广为人知的一种协议,在RabbitMQ中,生产者和消费者与RabbitMQ的通信就是基于TCP连接的。不过呢我们知道TCP连接的创建和销毁在高并发场景下对于操作系统来说都是特别昂贵的开销,所以Rab... 阅读详情

本指南将引导您完成设置发布和订阅消息的 RabbitMQ AMQP 服务器以及创建 Spring Boot 应用程序以与该 RabbitMQ 服务器交互的过程。

你将建造什么

您将构建一个应用程序,该应用程序使用 Spring AMQP 发布消息​​RabbitTemplate​​并使用​​MessageListenerAdapter​​.

你需要什么

  • 约15分钟
  • 最喜欢的文本编辑器或 IDE
  • JDK 11或更高版本
  • Gradle 4+或Maven 3.2+
  • 您还可以将代码直接导入 IDE:
  • 弹簧工具套件 (STS)
  • IntelliJ IDEA
  • 设置 RabbitMQ 服务器。请参阅设置 RabbitMQ 代理。

如何完成本指南

像大多数 Spring入门指南一样,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会得到工作代码。

要从头开始,请继续设置 RabbitMQ 代理。

要跳过基础知识,请执行以下操作:

  • 下载并解压本指南的源代码库,或使用Git克隆它:git clone https://github.com/spring-guides/gs-messaging-rabbitmq.git
  • 光盘进入gs-messaging-rabbitmq/initial
  • 跳转到从 Spring Initializr 开始。

完成后,您可以对照中的代码检查结果​​gs-messaging-rabbitmq/complete​​。

设置 RabbitMQ 代理

在构建消息传递应用程序之前,您需要设置一个服务器来处理接收和发送消息。

RabbitMQ 是一个 AMQP 服务器。该服务器可在https://www.rabbitmq.com/download.html免费获得。您可以手动下载它,或者,如果您使用带有 Homebrew 的 Mac,则可以在终端窗口中运行以下命令:

brew install rabbitmq复制

通过在终端窗口中运行以下命令,解压缩服务器并使用默认设置启动它:

rabbitmq-server复制

您应该会看到类似于以下内容的输出:

            RabbitMQ 3.1.3. Copyright (C) 2007-2013 VMware, Inc.
##  ##      Licensed under the MPL.  See https://www.rabbitmq.com/
##  ##
##########  Logs: /usr/local/var/log/rabbitmq/rabbit@localhost.log
######  ##        /usr/local/var/log/rabbitmq/rabbit@localhost-sasl.log
##########
            Starting broker... completed with 6 plugins.复制

如果您在本地运行 Docker,您还可以使用Docker Compose快速启动 RabbitMQ 服务器。Github 项目​​docker-compose.yml​​的根目录中有一个。​​complete​​这非常简单,如下面的清单所示:

rabbitmq:
  image: rabbitmq:management
  ports:
    - "5672:5672"
    - "15672:15672"复制

使用当前目录中的此文件,您可以运行​​docker-compose up​​以使 RabbitMQ 在容器中运行。

从 Spring Initializr 开始

您可以使用这个预先初始化的项目并单击 Generate 下载 ZIP 文件。此项目配置为适合本教程中的示例。

手动初始化项目:

  1. 导航到https://start.spring.io。该服务提取应用程序所需的所有依赖项,并为您完成大部分设置。
  2. 选择 Gradle 或 Maven 以及您要使用的语言。本指南假定您选择了 Java。
  3. 单击Dependencies并为 RabbitMQ 选择Spring。
  4. 单击生成。
  5. 下载生成的 ZIP 文件,该文件是根据您的选择配置的 Web 应用程序的存档。
如果您的 IDE 具有 Spring Initializr 集成,您可以从您的 IDE 完成此过程。
你也可以从 Github 上 fork 项目并在你的 IDE 或其他编辑器中打开它。

创建 RabbitMQ 消息接收器

对于任何基于消息传递的应用程序,您都需要创建一个响应已发布消息的接收器。以下清单(来自​​src/main/java/com.example.messagingrabbitmq/Receiver.java​​)显示了如何执行此操作:

package com.example.messagingrabbitmq;

import java.util.concurrent.CountDownLatch;
import org.springframework.stereotype.Component;

@Component
public class Receiver {

  private CountDownLatch latch = new CountDownLatch(1);

  public void receiveMessage(String message) {
    System.out.println("Received <" + message + ">");
    latch.countDown();
  }

  public CountDownLatch getLatch() {
    return latch;
  }

}复制

这​​Receiver​​是一个 POJO,它定义了接收消息的方法。当您注册它以接收消息时,您可以将其命名为任何您想要的名称。

为了方便起见,这个 POJO 也有一个CountDownLatch. 这让它发出已收到消息的信号。这是您不太可能在生产应用程序中实现的东西。

注册监听器并发送消息

Spring AMQP​​RabbitTemplate​​提供了使用 RabbitMQ 发送和接收消息所需的一切。但是,您需要:

  • 配置消息侦听器容器。
  • 声明队列、交换器以及它们之间的绑定。
  • 配置一个组件发送一些消息来测试监听器。
Spring Boot 会自动创建连接工厂和 RabbitTemplate,从而减少您必须编写的代码量。

您将使用​​RabbitTemplate​​​来发送消息,并且您将​​Receiver​​​使用消息侦听器容器注册一个以接收消息。连接工厂驱动两者,让它们连接到 RabbitMQ 服务器。以下清单(来自​​src/main/java/com.example.messagingrabbitmq/MessagingRabbitApplication.java​​)显示了如何创建应用程序类:

package com.example.messagingrabbitmq;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class MessagingRabbitmqApplication {

  static final String topicExchangeName = "spring-boot-exchange";

  static final String queueName = "spring-boot";

  @Bean
  Queue queue() {
    return new Queue(queueName, false);
  }

  @Bean
  TopicExchange exchange() {
    return new TopicExchange(topicExchangeName);
  }

  @Bean
  Binding binding(Queue queue, TopicExchange exchange) {
    return BindingBuilder.bind(queue).to(exchange).with("foo.bar.#");
  }

  @Bean
  SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
      MessageListenerAdapter listenerAdapter) {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(connectionFactory);
    container.setQueueNames(queueName);
    container.setMessageListener(listenerAdapter);
    return container;
  }

  @Bean
  MessageListenerAdapter listenerAdapter(Receiver receiver) {
    return new MessageListenerAdapter(receiver, "receiveMessage");
  }

  public static void main(String[] args) throws InterruptedException {
    SpringApplication.run(MessagingRabbitmqApplication.class, args).close();
  }

}复制

​​@SpringBootApplication​​是一个方便的注释,它添加了以下所有内容:

  • ​​@Configuration​​: 将类标记为应用程序上下文的 bean 定义源。
  • ​​@EnableAutoConfiguration​​:告诉 Spring Boot 根据类路径设置、其他 bean 和各种属性设置开始添加 bean。例如,如果spring-webmvc位于类路径上,则此注释将应用程序标记为 Web 应用程序并激活关键行为,例如设置DispatcherServlet.
  • ​​@ComponentScan​​: 告诉 Spring 在包中查找其他组件、配置和服务com/example,让它找到控制器。

该​​main()​​方法使用 Spring Boot 的​​SpringApplication.run()​​方法来启动应用程序。您是否注意到没有一行 XML?也没有​​web.xml​​文件。这个 Web 应用程序是 100% 纯 Java,您不必处理任何管道或基础设施的配置。

方法中定义的 bean​​listenerAdapter()​​​被注册为容器中的消息监听器(定义在 中​​container()​​​)。它侦听​​spring-boot​​​队列中的消息。因为​​Receiver​​​该类是 POJO,所以需要将其包装在 中​​MessageListenerAdapter​​​,您可以在其中指定它调用​​receiveMessage​​.

JMS 队列和 AMQP 队列具有不同的语义。例如,JMS 仅将排队的消息发送给一个消费者。虽然 AMQP 队列做同样的事情,但 AMQP 生产者并不直接将消息发送到队列。相反,一条消息被发送到一个交换器,该交换器可以发送到单个队列或扇出到多个队列,模拟 JMS 主题的概念。

消息侦听器容器和接收器 bean 是您侦听消息所需的全部内容。要发送消息,您还需要一个 Rabbit 模板。

该​​queue()​​​方法创建一个 AMQP 队列。该​​exchange()​​​方法创建主题交换。该方法将这两者绑定在一起,定义发布到交换​​binding()​​​时发生的行为。​​RabbitTemplate​​

Spring AMQP 要求将Queue、TopicExchange和Binding声明为顶级 Spring bean 以便正确设置。

在这种情况下,我们使用主题交换,并且队列与路由键绑定​​foo.bar.#​​​,这意味着以 开头的路由键发送的任何消息都会​​foo.bar.​​被路由到队列。

发送测试消息

在此示例中,测试消息由 a 发送​​CommandLineRunner​​,它还等待接收器中的闩锁并关闭应用程序上下文。以下清单(来自​​src/main/java/com.example.messagingrabbitmq/Runner.java​​)显示了它是如何工作的:

package com.example.messagingrabbitmq;

import java.util.concurrent.TimeUnit;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class Runner implements CommandLineRunner {

  private final RabbitTemplate rabbitTemplate;
  private final Receiver receiver;

  public Runner(Receiver receiver, RabbitTemplate rabbitTemplate) {
    this.receiver = receiver;
    this.rabbitTemplate = rabbitTemplate;
  }

  @Override
  public void run(String... args) throws Exception {
    System.out.println("Sending message...");
    rabbitTemplate.convertAndSend(MessagingRabbitmqApplication.topicExchangeName, "foo.bar.baz", "Hello from RabbitMQ!");
    receiver.getLatch().await(10000, TimeUnit.MILLISECONDS);
  }

}复制

​​foo.bar.baz​​请注意,模板使用与绑定匹配的路由键将消息路由到交换器。

在测试中,您可以模拟运行器,以便可以单独测试接收器。

运行应用程序

该​​main()​​方法通过创建 Spring 应用程序上下文来启动该过程。这将启动消息侦听器容器,该容器开始侦听消息。有一个​​Runner​​bean,然后会自动运行。它从应用程序上下文中检索并在队列​​RabbitTemplate​​中发送​​Hello from RabbitMQ!​​消息。​​spring-boot​​最后,它关闭 Spring 应用程序上下文,应用程序结束。

构建一个可执行的 JAR

您可以使用 Gradle 或 Maven 从命令行运行应用程序。您还可以构建一个包含所有必要依赖项、类和资源的单个可执行 JAR 文件并运行它。构建可执行 jar 可以在整个开发生命周期、跨不同环境等中轻松地作为应用程序交付、版本化和部署服务。

如果您使用 Gradle,则可以使用​​./gradlew bootRun​​. 或者,您可以使用构建 JAR 文件​​./gradlew build​​,然后运行 ​​JAR 文件,如下所示:

java -jar build/libs/gs-messaging-rabbitmq-0.1.0.jar

如果您使用 Maven,则可以使用​​./mvnw spring-boot:run​​. 或者,您可以使用构建 JAR 文件,​​./mvnw clean package​​然后运行该 JAR 文件,如下所示:

java -jar 目标/gs-messaging-rabbitmq-0.1.0.jar
此处描述的步骤创建了一个可运行的 JAR。您还可以构建经典的 WAR 文件。

您应该看到以下输出:

    Sending message...
    Received <Hello from RabbitMQ!>复制

概括

恭喜!您刚刚使用 Spring 和 RabbitMQ 开发了一个简单的发布和订阅应用程序。您可以使用Spring 和 RabbitMQ做比这里更多的事情,但本指南应该提供一个良好的开端。

 

19、使用 RabbitMQ 进行间接消息传递 本文介绍了如何使用 RabbitMQ 实现微服务之间的间接消息传递。通过 Node.js 的 amqplib 库,结合 Docker 和 Docker Compose 配置 RabbitMQ 服务器,详细演示了微服务如何连接消息队列并实现单接收者的消息发送与接收。文中还介绍了 RabbitMQ 仪表板的使用,以及如何通过断言队列和发布/消费消息机制构建灵活的消息传递架构,帮助开发者更好地构建高效、可靠的微服务系统。 阅读详情

相关推荐

使用RabbitMQ进行消息传递的Java示例

在上面的代码中,我们首先创建一个ConnectionFactory对象,并设置它的主机为"localhost"。通过RabbitMQ,我们可以实现可靠的消息传递机制,以便在分布式系统中进行应用程序之间的通信。通过RabbitMQ,我们可以实现可靠的消息传递机制,以便在分布式系统中进行应用程序之间的通信。我们将创建一个生产者应用程序,向队列发送消息,然后创建一个消费者应用程序,从队列接收并处理这些消息。我们将创建一个生产者应用程序,向队列发送消息,然后创建一个消费者应用程序,从队列接收并处理这些消息。

EvktJava的博客 268

RabbitMQ 消息传递与监听

RabbitMQ 提供了一个可靠的消息传递机制,使得在分布式系统中进行消息传递变得简单而高效。本文介绍了 RabbitMQ 的基本概念和使用方法,包括消息的发布和订阅,以及如何监听消息的到达。在这篇文章中,我们学习了如何使用 RabbitMQ 在生产者和消费者之间传递消息。我们使用了 Python 作为示例编程语言,并展示了如何使用 pika 库与 RabbitMQ 进行交互。希望本文能够帮助你理解 RabbitMQ 的消息传递机制,并能够在实际项目中应用它来构建可靠的分布式系统。

EvktJava的博客 495

使用RabbitTemplate与RabbitMQ进行消息传递

在Java应用程序中,使用RabbitTemplate可以方便地与RabbitMQ进行交互,实现消息的发送和接收。通过配置RabbitMQ连接信息、创建消息生产者和消息消费者,并通过RabbitTemplate发送和接收消息,我们可以实现可靠的消息传递。注意:在测试之前,请确保已经正确安装和启动了RabbitMQ服务器,并且配置文件中的连接信息与RabbitMQ服务器的配置相匹配。现在,我们可以创建一个消息生产者,使用RabbitTemplate发送消息到RabbitMQ。在上面的示例中,我们使用。

EvktJava的博客 304

rabbitmq-dump-queue:将消息从 RabbitMQ 队列转储到文件,而不影响队列

rabbitmq-转储队列 将消息从 RabbitMQ 队列转储到文件,而不影响队列。 安装 下载一个版本 可以在页面上找到预编译的二进制包。 从源代码编译 如果您安装了 ,则可以通过运行以下命令从源代码安装 rabbitmq-dump-queue: go get github.com/dubek/rabbitmq-dump-queue rabbitmq-dump-queue可执行文件将在$GOPATH/bin目录中创建。 用法 倾倒的队列中的第一个50个信息incoming_1到/tmp : rabbitmq-dump-queue -uri="amqp://user:password@rabbitmq.example.com:5672/" -queue=incoming_1 -max-messages=50 -output-dir=/tmp 这将创建文件/tmp/msg-0000

【电力系统】高压直流输电VSC-HVDC,四个变流站联合输电 / 交直流混合并网系统

本文研究了一种基于电压源型换流器(VSC)的高压直流输电(HVDC)系统,该系统通过四个变流站实现联合输电并接入交直流混合电网。文章介绍了系统的结构、工作原理以及控制策略,分析了交直流混合并网的特性,并通过仿真验证了系统的性能。结果表明,该系统具有良好的稳定性和灵活性,能够有效实现多点供电和功率协调。

2401_84610415的博客 2239

Win10和Ubantu16.04双系统下,卸载Ubantu

Win10和Ubantu16.04双系统下,卸载Ubantu 机器配置 华硕主板,英伟达显卡(这不是重点) Win10与Ubantu16.04均为UFFI分区(如果不知道这个也不需要在意,一般默认的都是这样,鸵鸟原则) 清除Ubantu系统 一般按照常规的方法来删除Ubantu,都是直接将磁盘管理器里面的关于Ubantu的磁盘清空,但是还会留下一个UFFI分区,如果不进行删除的话,开机时候还是会有...

qq_33289694的博客 391

vhr 微人事系统安装与部署教程(SpringBoot + Vue 项目实战)

vhr(微人事)是一个开源的人力资源管理系统项目。系统采用前后端分离架构,主要技术栈包括:后端:MyBatis前端:VueElement UIAxios数据库:MySQL系统通常包含以下模块:员工管理部门管理职位管理薪资管理权限管理系统管理整体功能已经接近企业级后台系统。vhr(微人事)是一个非常经典的开源人力资源管理系统项目,基于SpringBoot + Vue 前后端分离架构。系统包含:员工管理部门管理权限管理薪资管理。

m0_69484557的博客 486

DFT实训教程笔记2(bibili版本)- Scan synthesis practice

文章目录Scan synthesis practice 本博文是博主记录DFT实训教程的笔记版本,此笔记并没有对所有的知识进行记录,仅仅以自身的认知水平,来记录了一些部分笔记并加上了自己的理解。 Scan synthesis practice How to design scan clock structure? 假设一块chip里面有好几十个clock domain,如果每一个clock domain都用一个scan clock虽然会非常清晰,但是IO数目肯定不够用。 clock group: 1、no

ciscomonkey的博客 9082

基于 InceptionNeXt 模块增强的 YOLOv8 模型:针对多尺度目标检测的改进与实现

modules.py。

know_F0727的博客 204

YOLO11改进-注意力-引入级联组注意力机制(Cascaded Group Attention, CGA)

输入特征拆分:输入特征进入 CGA 模块后,被均匀拆分为个部分,每个部分作为一个注意力头的输入,这样每个头关注输入特征的不同部分,实现特征的并行处理,同时为提高注意力多样性奠定基础。注意力头计算单元:每个注意力头包含三个线性投影层、、用于将输入特征映射到不同子空间,以及计算自注意力的单元。在计算过程中,通过注意力头之间的级联操作,前一个头的输出会累加到下一个头的输入上,实现特征的逐步细化。

qq_64693987的博客 2489

拼多多全站商品SKU数据爬虫实战:Python自动化采集与清洗

在电商数据分析领域,SKU(Stock Keeping Unit,库存量单位)数据是洞察商品策略、价格体系和市场竞争格局的核心抓手。本文以拼多多平台为研究对象,系统讲解如何利用Python构建一套完整的全站商品SKU自动化采集与清洗流程。文章涵盖目标分析与反爬策略、网络请求模拟、数据解析、分布式存储、数据清洗与标准化,以及调度与运维等全链路环节,并提供可直接运行的代码示例。拼多多API返回的数据结构大致如下(已脱敏):json"goods_name": "某品牌运动鞋",

2201_76125261的博客 216

基于STM32的多传感器融合的设施农业小型搬运机器人避障控制系统设计

针对设施农业场景中狭窄通道、障碍物多样(如农机具、作物植株、水管)的特点,设计一款基于 STM32 的小型搬运机器人避障控制系统。系统通过多传感器融合实现 360° 环境感知,采用模糊 PID 控制算法实现平滑避障,满足温室、大棚等场景的搬运需求。通过在温室环境测试,系统可实现对直径≥5cm 障碍物的有效检测(检测距离误差≤5%),避障转向半径≤30cm,平均功耗≤15W。后续可通过增加激光雷达(如 TFmini)提升远距离障碍物检测能力,结合 SLAM 算法实现路径规划。

weixin_42300449的博客 860

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: 使用 Redis 进行消息传递
下一篇: Spring Boot 入门
Spring认证
博客等级 码龄4年 7粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值