RabbitMQ快速入门 - 生产者和消费者的简单实现

server/2024/12/16 7:39:08/

引入依赖

<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.7.3</version>
</dependency>

编写生产者代码

        RabbitMQ 默认的⽤于客户端连接的 TCP 端⼝号是 5672, 需要提前进⾏开放

代码及其注解

package rabbitmq.producer;/*** Created with IntelliJ IDEA.* Description:* User: wuyulin* Date: 2024-12-10* Time: 15:12*/import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** 生产者* */
public class ProducerDemo {public static void main(String[] args) throws IOException, TimeoutException {// 1. 创建连接⼯⼚ConnectionFactory factory = new ConnectionFactory();//2. 设置参数factory.setHost("192.168.66.129");//ip 默认值localhostfactory.setPort(5672); //默认值 5672factory.setVirtualHost("wuyulin");//虚拟机名称, 默认 /factory.setUsername("wuyulin");//⽤户名,默认guestfactory.setPassword("wuyulin");//密码, 默认guest//3. 创建连接ConnectionConnection connection = factory.newConnection();//4. 创建channel通道Channel channel = connection.createChannel();//5.声明交换机 使用内置的交换机//当⼀个新的RabbitMQ节点启动时,它会预声明(declare)⼏个内置的交换机,内置交换机名称是空字符串("").// ⽣产者发送的消息会根据队列名称直接路由到对应的队列.//6.声明队列/*queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)1.queue: 队列名称2.durable: 是否持久化.true-设置队列为持久化, 待久化的队列会存盘,服务器重启之后, 消息不丢失。3.exclusive:* 是否独占, 只能有⼀个消费者监听队列* 当Connection关闭时, 是否删除队列4.autoDelete: 是否⾃动删除, 当没有Consumer时, ⾃动删除掉5.arguments: ⼀些参数*/
//如果没有⼀个hello 这样的⼀个队列, 会⾃动创建, 如果有, 则不创建channel.queueDeclare("hello",true,false,false,null);//7.通过channel发送消息到队列中/*
basicPublish(String exchange, String routingKey, AMQP.BasicProperties props, byte[] body)
1.exchange: 交换机名称, 简单模式下, 交换机会使⽤默认的""
2.routingKey: 路由名称, routingKey = 队列名称
3.props: 配置信息
4.body: 发送消息的数据*/String msg = "Hello RabbitMQ";channel.basicPublish("","hello",null,msg.getBytes());System.out.println(msg + "消息发送成功");//释放资源//显式地关闭Channel是个好习惯, 但这不是必须的, Connection关闭的时候,Channel也会⾃动关闭.channel.close();connection.close();}
}

注意事项

        当⼀个新的 RabbitMQ 节点启动时,它会预声明(declare)⼏个内置的交换机,内置交换机名称是空字符串("").⽣产者发送的消息会根据队列名称直接路由到对应的队列.

        例如:如果有⼀个名为 "hello" 的队列,⽣产者可以直接发送消息到 "hello" 队列,⽽消费者可以从 "hello" 队列中接收消息,⽽不需要关⼼交换机的存在.这种模式⾮常适合简单的应⽤场景,其中⽣产者和消费者之间的通信是⼀对⼀的.

运行代码,观察结果

运⾏之前

运⾏之后,队列中就已经有了 hello 这个队列的信息

可以点击 “hello” 这个队列名称,进入详情页,查看队列中的数据

如果在代码中注掉资源释放的代码,在 Connections 和 Channels 也可以看到相关信息

‘Queue 也可以配置显⽰ Consumer 相关信息

编写消费者代码

消费者代码和⽣产者前3步都是⼀样的,第4步改为消费当前队列

1. 创建连接

2. 创建 Channel 

3. 声明⼀个队列 Queue(

为什么消费者要声明队列,因为如果要消费的队列不存在就会报错,所以为了避免队列还未创建,消费者可以事先声明
)

4. 消费消息

5. 释放资源(

消费者相当于是⼀个监听程序, 一般不需要关闭资源

代码及其注解

package rabbitmq.producer;import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;/*** Created with IntelliJ IDEA.* Description:* User: wuyulin* Date: 2024-12-13* Time: 10:46*/
public class ConsumeDemo {public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {// 1. 创建连接⼯⼚ConnectionFactory factory = new ConnectionFactory();//2. 设置参数factory.setHost("192.168.66.129");//ip 默认值localhostfactory.setPort(5672); //默认值 5672factory.setVirtualHost("wuyulin");//虚拟机名称, 默认 /factory.setUsername("wuyulin");//⽤户名,默认guestfactory.setPassword("wuyulin");//密码, 默认guest//3. 创建连接ConnectionConnection connection = factory.newConnection();//4. 创建channel通道Channel channel = connection.createChannel();//5.声明队列(为什么消费者要声明队列,因为如果要消费的队列不存在就会报错,所以为了避免队列还未创建,消费者可以事先声明)/*queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)1.queue: 队列名称2.durable: 是否持久化.true-设置队列为持久化, 待久化的队列会存盘,服务器重启之后, 消息不丢失。3.exclusive:* 是否独占, 只能有⼀个消费者监听队列* 当Connection关闭时, 是否删除队列4.autoDelete: 是否⾃动删除, 当没有Consumer时, ⾃动删除掉5.arguments: ⼀些参数*/
//如果没有⼀个hello 这样的⼀个队列, 会⾃动创建, 如果有, 则不创建channel.queueDeclare("hello",true,false,false,null);//6. 接收消息, 并消费/*basicConsume(String queue, boolean autoAck, Consumer callback)参数:1. queue: 队列名称2. autoAck: 是否⾃动确认, 消费者收到消息之后,⾃动和MQ确认3. callback: 回调对象Consumer ⽤于定义消息消费者的⾏为.当我们需要从RabbitMQ接收消息时,需要提供⼀个实现了Consumer 接⼝的对象.
DefaultConsumer 是RabbitMQ提供的⼀个默认消费者,实现了 Consumer 接⼝.*/DefaultConsumer consumer = new DefaultConsumer(channel) {/*回调⽅法, 当收到消息后, 会⾃动执⾏该⽅法在这个⽅法中,我们可以定义如何处理接收到的消息,例如打印消息内容,处理业务逻辑或者将消息存储到数据库等.1. consumerTag: 标识2. envelope: 获取⼀些信息, 交换机, 路由key3. properties:配置信息4. body:数据*/@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("接收到消息: " + new String(body));}};channel.basicConsume("hello", true, consumer);//等待回调函数执⾏完毕之后, 关闭资源TimeUnit.SECONDS.sleep(2);//7. 释放资源 消费者相当于是⼀个监听程序, 不需要关闭资源//顺序不可改变
//        channel.close();
//        connection.close();}
}

运行代码,观察结果

运⾏程序,我们刚才发送的消息,就收到了

如果我们不释放资源,可以看到响应的 Connection,channel

并且可以看到 hello 队列中的数据被消费者全部取出


http://www.ppmy.cn/server/150567.html

相关文章

泷羽sec学习打卡-brupsuite8伪造IP和爬虫审计

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-Brup-FaskIP 伪造IP配置环境brupsuite导入配置1、扩展中先配置python环境2、安…

3D 生成重建030-SV3D合成环绕视频以生成3D

3D 生成重建030-SV3D合成环绕视频以生成3D 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 论文提出了Stable Video 3D (SV3D)——一个用于生成围绕三维物体的高分辨率图像到多视角视频的潜在视频扩散模型。最近关于三维生成的文献提出了将二维生成模型应用于新视图合成…

小程序开发中的插件生态与应用-上

更多精彩内容都在公zhong号&#xff1a;小白的大数据之旅 在小程序的开发过程中&#xff0c;插件作为扩展功能、提升效率的重要工具&#xff0c;扮演着不可或缺的角色。它们不仅能够帮助开发者快速集成复杂的功能模块&#xff0c;还能优化开发流程&#xff0c;缩短项目周期。 …

基于小程序实现日历课表、排班表、月份切换、快捷周切换、自定义课程内容、课程颜色、Mock数据开箱即用

目录 引言小程序开发背景本文目标:实现日历课表/排班表适用场景:学生课表、员工排班、日程安排等需求分析支持日历视图和课表/排班视图可以查看、添加、编辑、删除课表/排班项支持按周、月查看总结说明参考代码数据Mock引言 本文将介绍如何基于小程序实现一个日历课表和排班表…

数据结构题集-第三章-栈和队列-Ackerman函数

Ackerman函数 说明3.27 已知Ackerman函数的定义如下&#xff08;1&#xff09;递归算法如下&#xff08;2&#xff09;非递归算法如下&#xff08;3&#xff09; a k m ( 2 , 1 ) akm(2,1) akm(2,1)时栈的变化过程如下 说明 本文参照严蔚敏《数据结构(C语言版)题集》一书中包含…

@Repository

Repository 是 Spring 框架中用来标识数据访问对象&#xff08;DAO&#xff09;层的注解。以下是关于 Repository 注解的一些关键点&#xff1a; Bean 注册&#xff1a;Repository 注解会自动将使用该注解的类注册为 Spring 容器中的 Bean&#xff0c;无需在 XML 配置文件中显式…

UE4_贴花_贴花基础知识一

贴花可以将材料和各种材料元素投影到表面上。您可以使用它们来添加独特的效果。贴花 是一种可以投射到网格体&#xff08;包括静态网格体和骨骼网格体&#xff09;上的材质。无论这些网格体的移动性&#xff08;Mobility&#xff09;是静态&#xff08;Static&#xff09;还是可…

oracle网络架构

Oracle 网络配置文件 Oracle 的网络配置主要涉及三个关键的文件&#xff1a;listener.ora、tnsnames.ora 和 sqlnet.ora。这些文件通常位于 $ORACLE_HOME/network/admin/ 目录下&#xff0c;$ORACLE_HOME 是 Oracle 安装目录的环境变量&#xff0c;通常为 /u01/app/oracle/pro…