当前位置: 首页 > news >正文

RabbitMQ 入门篇

接上一篇《RabbitMQ-安装篇(阿里云主机)-CSDN博客》

安装好RabbitMQ后,我们将开始RabbitMQ的使用,根据官网文档RabbitMQ Tutorials | RabbitMQ,我们一步一步的学习。

1. "Hello World!"

这里先说明几个概念:

生产者:指消息的发送方,用图例表示。

消费者:指消息的接收放,用图例表示。

队列(queue):生产者发送的消息将被传递到队列里,消费这从队列中消费消息

下面以 生产者 发送消息到队列,消费者从队列里消费消息为例,演示如何调用(Java代码)。

RabbitMQ支持多种协议。本教程使用AMQP0-9-1,它是一个开放的、通用的消息传递协议。

1.1 下载依赖项

下载客户端库客户端连接库及其依赖项(SLF4J API和SLF4J Simple)。将这些文件复制到您的工作目录中,连同教程Java文件。

1.2 生产者代码-Send.java

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.nio.charset.StandardCharsets;//生产者
public class Send {public static void main(String[] argv) throws Exception {// 创建连接ConnectionFactory factory = new ConnectionFactory();factory.setHost("【服务器地址】");factory.setPort(【端口:默认5672】);factory.setUsername("【账号】");factory.setPassword("【密码】");factory.setVirtualHost("【虚拟主机】");// 创建信道,发送消息String queueName = "rc.queue";try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {channel.queueDeclare(queueName, true, false, false, null);String message = "Hello World!";channel.basicPublish("", queueName, null, message.getBytes(StandardCharsets.UTF_8));System.out.println(" [x] Sent '" + message + "'");}}
}

请将代码中相关配置项设置为您自己的配置。

运行代码,即可向RabbitMQ中的rc.queue队列发送一条Hello World消息。(rc.queue为我自己创建的,请根据实际情况调整)

在RabbitMQ后台可以查看到该队列里的消息。

1.3 消费者代码-Recv.java

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
import java.nio.charset.StandardCharsets;//消费者
public class Recv {public static void main(String[] argv) throws Exception {// 创建连接ConnectionFactory factory = new ConnectionFactory();factory.setHost("【服务器地址】");factory.setPort(【端口:默认5672】);factory.setUsername("【账号】");factory.setPassword("【密码】");factory.setVirtualHost("【虚拟主机】");// 创建连接通道Connection connection = factory.newConnection();Channel channel = connection.createChannel();String queueName = "rc.queue";channel.queueDeclare(queueName, true, false, false, null);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), StandardCharsets.UTF_8);System.out.println(" [x] Received '" + message + "'");};channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {});}
}

运行结果

2.其他模式

调通了1种模式,其他模式类似的方式调试即可。RabbitMQ Tutorials | RabbitMQ

3.在Springboot中使用RabbitMQ  

3.1 添加依赖

pom.xml中添加Spring Boot的RabbitMQ依赖。

<!--RabbitMQ-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

 3.2 配置RabbitMQ

application.propertiesapplication.yml中配置RabbitMQ连接信息。

# application.properties
spring.rabbitmq.host=【服务器地址】
spring.rabbitmq.port=【端口:默认5672】
spring.rabbitmq.username=【用户名】
spring.rabbitmq.password=【密码】
spring:rabbitmq:host: 【服务器地址】port: 【端口:默认5672】username: 【用户名】password: 【密码】

 配置Queue、Exchange和Binding:

通过Java配置类定义消息队列、交换器和它们之间的绑定关系。

(如果在RabbitMQ控制台设置好了Queue、Exchange和Binding,无需下面的配置)

@Configuration
public class RabbitMQConfig {@BeanQueue myQueue() {return new Queue("your-queue-name", true);}@BeanDirectExchange myExchange() {return new DirectExchange("your-exchange");}@BeanBinding binding(Queue myQueue, DirectExchange myExchange) {return BindingBuilder.bind(myQueue).to(myExchange).with("your-routingKey");}
}

3.3 创建消息生产者

定义一个简单的消息生产者类,使用@RabbitTemplate注解来发送消息到队列:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MessageProducer {private final RabbitTemplate rabbitTemplate;@Autowiredpublic MessageProducer(RabbitTemplate rabbitTemplate) {this.rabbitTemplate = rabbitTemplate;}public void sendMessage(String message) {rabbitTemplate.convertAndSend("your-queue-name", message);}
}

3.4.创建消息消费者

定义一个消息消费者类,使用@RabbitListener注解来监听特定的队列:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class MessageConsumer {@RabbitListener(queues = "your-queue-name")public void receiveMessage(String message) {System.out.println("Received message: " + message);}
}

3.5.启动和测试

确保你的应用启动类上有@EnableRabbit注解启用RabbitMQ。确保你的RabbitMQ服务正在运行,并尝试从你的应用中发送和接收消息。你可以通过调用MessageProducer中的sendMessage方法来测试发送功能,而接收功能应该自动触发MessageConsumer中的receiveMessage方法。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【数学建模】——【A题 信用风险识别问题】全面解析
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • 【文件fd】深入理解重定向和缓冲区
  • python-局部求和(赛氪OJ)
  • 2024年有什么赚钱的副业推荐半年还清贷款,成功变现12.3w的全套玩法都放这里了!!!
  • linux用户组练习
  • FastAPI之Depends
  • Scrapy 爬取旅游景点相关数据(五)
  • 【LLM】-14-搭建问答系统
  • 天气曲线echarts
  • PHP常用函数
  • Opencv学习-LUT函数
  • 人工智能未来展望
  • 基于域名的虚拟主机、多虚拟主机的配置、基于ip的虚拟主机及上线静态的前端系统(商城系统)
  • jenkins服务器重启,构建记录消失
  • 《剑指offer》分解让复杂问题更简单
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 〔开发系列〕一次关于小程序开发的深度总结
  • IDEA常用插件整理
  • java8-模拟hadoop
  • js递归,无限分级树形折叠菜单
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Node 版本管理
  • python 装饰器(一)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • windows-nginx-https-本地配置
  • 多线程 start 和 run 方法到底有什么区别?
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 前端工程化(Gulp、Webpack)-webpack
  • 为什么要用IPython/Jupyter?
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​Redis 实现计数器和限速器的
  • #git 撤消对文件的更改
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #pragma once
  • #Spring-boot高级
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (4.10~4.16)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (floyd+补集) poj 3275
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (分布式缓存)Redis持久化
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (一)认识微服务
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 的静态构造函数是否线程安全?答案是肯定的!