RabbitMQ 消息队列:生产者与消费者实现详解

在分布式系统中,消息队列(Message Queue, MQ)是一种重要的组件,用于解耦系统、异步处理任务以及实现系统间的通信。RabbitMQ 是一个流行的开源消息代理软件,它实现了高级消息队列协议(AMQP)。在本文中,我们将通过 Java 示例来演示如何使用 RabbitMQ 的生产者和消费者模型。

1. 环境准备

首先,确保你已经安装了 RabbitMQ 服务器,并且 Java 环境已经配置妥当。你还需要在项目中引入 RabbitMQ 的 Java 客户端库。通常,这可以通过 Maven 或 Gradle 等构建工具来实现。

2. 生产者(Producer)

生产者负责发送消息到队列。以下是生产者的 Java 实现代码及其注释:

package com.qcby.rabbitmq.mq1;  import com.qcby.rabbitmq.connection.RabbitMQConnection; // 自定义的连接管理类  
import com.rabbitmq.client.Channel;  
import com.rabbitmq.client.Connection;  import java.io.IOException;  
import java.util.concurrent.TimeoutException;  // 生产者类  
public class Producer {  private static final String QUEUE_NAME = "boyatopMember"; // 队列名称  public static void main(String[] args) throws IOException, TimeoutException {  // 1. 创建连接  // 通过自定义的 RabbitMQConnection 类获取连接  Connection connection = RabbitMQConnection.getConnection("/boyavirtualHosts"); // 假设这是连接到特定虚拟主机的连接  // 2. 设置通道  // 通道是大多数 RabbitMQ API 调用的入口点  Channel channel = connection.createChannel();  // 3. 设置消息  String msg = "hello world"; // 待发送的消息  System.out.println("msg:" + msg); // 在控制台输出消息内容  // 4. 发送消息到队列  // 第一个参数是交换机名称,这里使用空字符串表示默认交换机(direct类型)  // 第二个参数是队列名称  // 第三个参数是消息的其他属性,这里传null表示默认  // 第四个参数是消息体,需要是字节数组形式  channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());  // 5. 关闭通道和连接  channel.close();  connection.close();  }  
}
3. 消费者(Consumer)

消费者负责从队列中接收并处理消息。以下是消费者的 Java 实现代码及其注释:

package com.qcby.rabbitmq.mq1;  import com.qcby.rabbitmq.connection.RabbitMQConnection; // 自定义的连接管理类  
import com.rabbitmq.client.*;  import java.io.IOException;  
import java.util.concurrent.TimeoutException;  // 消费者类  
public class Consumer {  private static final String QUEUE_NAME = "boyatopMember"; // 队列名称  public static void main(String[] args) throws IOException, TimeoutException {  // 1. 创建连接  Connection connection = RabbitMQConnection.getConnection("/boyavirtualHosts"); // 连接到特定虚拟主机  // 2. 设置通道  Channel channel = connection.createChannel();  // 3. 定义消费者  // 使用 DefaultConsumer 类并覆盖 handleDelivery 方法来处理接收到的消息  DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {  @Override  public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {  String msg = new String(body, "UTF-8"); // 将字节数组转换为字符串  System.out.println("消费者获取消息:" + msg); // 在控制台输出消息内容  }  };  // 4. 监听队列  // 第一个参数是队列名称  // 第二个参数是是否自动确认消息,true表示自动确认,false表示需要手动确认  // 第三个参数是消费者实例  channel.basicConsume(QUEUE_NAME, true, defaultConsumer);  // 注意:这里的代码实际上会阻塞等待消息的到来。  // 在实际应用中,你可能需要保持这个消费者程序持续运行,直到你显式地停止它。  }  
}

4. 自定义连接(connection)
 

package com.qcby.rabbitmq.connection;import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;import java.util.concurrent.TimeoutException;public class RabbitMQConnection {/*** 获取连接** @return*/public static Connection getConnection(String virtualHost) throws IOException, TimeoutException, TimeoutException {// 1.创建连接ConnectionFactory connectionFactory = new ConnectionFactory();// 2.设置连接地址connectionFactory.setHost("127.0.0.1");// 3.设置端口号:connectionFactory.setPort(5672);// 4.设置账号和密码connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");// 5.设置VirtualHostconnectionFactory.setVirtualHost(virtualHost);return connectionFactory.newConnection();}
}
5. 运行与测试
  1. 首先,启动 RabbitMQ 服务器。
  2. 运行 Producer 类的 main 方法发送消息。
  3. 运行 Consumer 类的 main 方法接收并处理消息。

如果一切设置正确,你将在 Consumer 的控制台输出中看到 "消费者获取消息:hello world" 的信息,表明消息已成功从生产者发送到消费者。

6. 结论

通过本文,我们学习了如何在 Java 中使用 RabbitMQ 实现基本的生产者和消费者模型。这仅仅是 RabbitMQ 强大功能的冰山一角,RabbitMQ 还支持多种交换机类型、消息确认机制、消息持久化等高级特性,可以帮助你构建更加健壮和灵活的分布式系统。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32的串行外设接口SPI

一、SPI简介 1.SPI总线特点 (1)四条通信线 SPI需要SCK、MISO、MOSI、NSS四条通信线来完成数据传输 ,每增加一个从机,多一条NSS通信线。 (2)多主多从 SPI总线允许有多个主机和多个从机。 (3&…

Markdown实用语法汇总

说明: 本来只展示本人常用的、markdown特有优势的一些语法。表格输入markdown的弱项,不作介绍,借助软件创建即可。引用图片、音频、视频等,虽然很方便,但是内容集成度不高,需要上传发布的时候很不方便&…

Linux高级编程_29_信号

文章目录 进程间通讯 - 信号信号完整的信号周期信号的编号信号的产生发送信号1 kill 函数(他杀)作用:语法:示例: 2 raise函数(自杀)作用:示例: 3 abort函数(自杀)作用:语法:示例: 4 …

GB28181信令交互流程及Android端设备对接探讨

GB28181规范必要性 好多开发者在做比如执法记录仪、智能安全帽、智能监控等设备端视频回传技术方案选型的时候,不清楚到底是用RTSP、RTMP还是GB28181,对GB28181相对比较陌生,我们就GB28181规范的必要性,做个探讨: 实现…

Pikachu-File Inclusion- 本地文件包含

前端每次挑选篮球明星,都会通过get请求,传了文件名,把页面展示出来,由于文件名时前端传给后台;并且查看源码,没有对参数做限制; 尝试直接从前端修改filename 参数; filename../../../../../../…

C++ | Leetcode C++题解之第458题可怜的小猪

题目&#xff1a; 题解&#xff1a; class Solution { public:int poorPigs(int buckets, int minutesToDie, int minutesToTest) {if (buckets 1) {return 0;}vector<vector<int>> combinations(buckets 1,vector<int>(buckets 1));combinations[0][0] …

交换排序:冒泡排序、递归实现快速排序

目录 冒泡排序 1.冒泡排序的核心思想 2.冒泡排序的思路步骤 3.冒泡排序代码 4.代码分析 5.对冒泡排序的时间复杂度是O(N^2)进行解析 6.冒泡排序的特性总结 递归实现快速排序(二路划分版本) 1.快速排序基本思路 2.代码思路步骤 3.代码实现 4.代码分析 (1)递归终止条…

基于H3C环境的实验——OSPF

目录 实验设备和环境 实验设备 实验环境 实验记录 1、单区域 OSPF基本配置 步骤1:搭建实验环境并完成基本配置 步骤2:检查网络连通性和路由器路由表。 步骤3:配置OSPF 步骤4:检查路由器OSPF邻居状态及路由表 实验设备和环境 实验设备 三台路由器、两台PC、电源线、两…

10.5学习

1.GateWay GateWay⽬标是取代Netflflix Zuul&#xff0c;它基于Spring5.0SpringBoot2.0WebFlux等技术开发&#xff0c;提供统⼀的路由⽅式&#xff08;反向代理&#xff09;并且基于 Filter(定义过滤器对请求过滤&#xff0c;完成⼀些功能) 链的⽅式提供了⽹关基本的功能&…

海南网站建设提升网站用户体验实用技巧

海南网站建设提升网站用户体验实用技巧 在当今数字时代&#xff0c;网站已成为企业展示形象和吸引客户的重要平台。尤其对于海南这一旅游胜地来说&#xff0c;优化网站用户体验显得尤为重要。以下是一些实用技巧&#xff0c;可帮助您提升网站的用户体验。 首先&#xff0c;确保…

八、Drf解析器

八、解析器 8.1概念 解析用户请求发送过来的数据&#xff08;常用的是JSON&#xff09; 请求类型&#xff1a; get: ​ 方式1&#xff1a; http://127.0.0.1/web/?arg1v1&arg2v2 ​ 方式2&#xff1a;通过请求头发送 post: ​ 请求头&#xff1a; ​ content-typ…

dbeaver的使用

新增mysql连接 新增clickhouse 连接 新建编辑器 执行 结果&#xff0c;想看某条结果明细&#xff0c;选中某行安tab键 设置快捷键 窗口-》首选项-》用户界面-》键

论文 | Model-tuning Via Prompts Makes NLP Models Adversarially Robust

这篇论文研究了使用提示 (Prompting) 方法微调预训练语言模型&#xff0c;以提高其在对抗样本攻击下的鲁棒性。论文的主要贡献如下&#xff1a; 1.MVP 比 MLP-FT 更鲁棒&#xff1a; 论文比较了 MVP (Model-tuning Via Prompts) 和传统的 MLP-FT (Fine-tuning with an MLP head…

①EtherCAT转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 EtherCAT 转 ModbusTCP GW系列型号 MS-GW15 简介 MS-GW15 是 EtherCAT 和 Modbus TCP 协议转换网关&#xff0c;为用户提供一种 …

vscode环境迁移

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 vscode环境迁移 Setting 即可打开settings.json {"python.pythonPath": "/Users/apple/opt/anaconda3/bin/python","cmake.cmakePath": "/usr/local/bin/cmake",&qu…

【Android 源码分析】Activity短暂的一生 -- 目录篇 (持续更新)

1. 前言 忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  …

pytest(三)——参数化@pytest.mark.parametrize

目录 前言 参数化场景 实际Web UI自动化中的开发场景&#xff0c;比如是一个登录框 parametrize单参数 “笛卡尔积”&#xff0c;多个参数化装饰器 重点知识 参考文献 前言 pytest.mark.parametrize 允许在测试函数或类中定义多组参数和fixtures pytest_generate_tests 允…

CTFshow 命令执行 web29~web36(正则匹配绕过)

目录 web29 方法一&#xff1a;include伪协议包含文件读取 方法二&#xff1a;写入文件 方法三&#xff1a;通识符 web30 方法一&#xff1a;filter伪协议文件包含读取 方法二&#xff1a;命令执行函数绕过 方法三&#xff1a;写入文件 web31 方法一&#xff1a;filter伪…

SpringCloud Alibaba - Eureka注册中心,Nacos配置中心

Eureka 1、创建服务端 server:port: 8761 # eureka 默认端口spring:application:name: eureka-server # 应用名称&#xff08;微服务中建议必须定义应用名称&#xff09; SpringBootApplication EnableEurekaServer // 开启eureka注册中心功能 public class EurekaServerAppli…

39 C 语言枚举类型、枚举常量、枚举变量、枚举的遍历、枚举数组、枚举与 switch

目录 1 什么是枚举 2 定义枚举类型 2.1 语法格式 2.2 枚举元素的特点 2.3 案例演示 3 枚举变量 3.1 什么是枚举变量 3.2 定义枚举变量的多种方式 3.3 案例演示 1&#xff1a;标准版枚举类型 3.4 案例演示 2&#xff1a;简化版枚举类型 3.5 案例演示 3&#xff1a;匿…