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

RabbitMQ中点对点(Point-to-Point)通讯方式的Java实现

RabbitMQ是一个广泛使用的开源消息代理软件,它实现了高级消息队列协议(AMQP)。RabbitMQ支持多种消息传递模式,其中最基本的是点对点(Point-to-Point)通讯方式。在这种模式下,消息生产者将消息发送到一个队列,而消息消费者从该队列中接收消息。每个消息只会被一个消费者消费一次。

下面将通过一个简单的Java代码案例,详细介绍如何在RabbitMQ中实现点对点通讯。

1. 原理分析

  • 一个生产者,一个默认的交换机,一个队列,一个消费者
  • 看起来是生产者直接发送到队列,实际上是发送到了默认交换机

在这里插入图片描述

结构图:

在这里插入图片描述

2. 环境准备

在开始之前,请确保你已经安装了以下环境:

  • Java Development Kit (JDK) 8 或更高版本
  • Apache Maven
  • RabbitMQ 服务器

你可以通过以下命令检查Java和Maven的安装情况:

java -version
mvn -version

3. 添加RabbitMQ依赖

首先,我们需要在Maven项目中添加RabbitMQ的Java客户端依赖。在你的pom.xml文件中添加以下内容:

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

4. 创建消息生产者

接下来,我们创建一个消息生产者,它将消息发送到RabbitMQ的队列中。

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class MessageProducer {private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.200.138");factory.setPort(5672);factory.setVirtualHost("/test");factory.setUsername("test");factory.setPassword("test");// 创建连接和通道try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 发送消息String message = "Hello World!aaa";// 发布消息到exchange,同时指定路由的规则// 参数1:指定exchange,使用""。代表默认交换机// 参数2:指定路由的规则,使用具体的队列名称。// 参数3:指定传递的消息所携带的properties,使用null。// 参数4:指定发布的具体消息,byte[]类型channel.basicPublish("", QUEUE_NAME, null, message.getBytes());// Ps:exchange是不会帮你将消息持久化到本地的,Queue才会帮你持久化消息。System.out.println(" [x] Sent '" + message + "'");}}
}

代码解析:

  1. ConnectionFactory: 用于创建到RabbitMQ服务器的连接。
  2. Connection: 代表与RabbitMQ服务器的物理连接。
  3. Channel: 用于发送和接收消息的通道。
  4. queueDeclare: 声明一个队列,如果队列不存在,则会创建它。
  5. basicPublish: 将消息发送到指定的队列。

默认交换机上可以看到生产者发送的消息:

在这里插入图片描述

5. 创建消息消费者

接下来,我们创建一个消息消费者,它将从RabbitMQ的队列中接收消息。

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;public class MessageConsumer {private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.200.138");factory.setPort(5672);factory.setVirtualHost("/test");factory.setUsername("test");factory.setPassword("test");// 创建连接和通道Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 声明队列//参数1:queue - 指定队列的名称//参数2:durable - 当前队列是否需要持久化(true)//参数3:exclusive:是否排外的,有两个作用://      一:当连接关闭时connection.close()该队列是否会自动删除;//      二:该队列是否是私有的private,如果不是排外的,可以使用两个消费者都访问同一个队列,没有任何问题,//          如果是排外的,会对当前队列加锁,其他通道channel是不能访问的,如果强制访问会报异常://          com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=405, reply-text=RESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'queue_name' in vhost '/', class-id=50, method-id=20)//          一般等于true的话用于一个队列只能有一个消费者来消费的场景//参数4:autoDelete - 如果这个队列没有消费者在消费,并且所有消息都消费完,队列自动删除//参数5:arguments - 指定当前队列的其他信息channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");// 设置消息回调DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + message + "'");};// 开始消费消息channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });}
}

代码解析:

  1. DeliverCallback: 用于处理接收到的消息的回调函数。
  2. basicConsume: 开始消费队列中的消息。

6. 运行代码

  1. 首先启动RabbitMQ服务器。
  2. 运行MessageProducer类,发送消息。
  3. 运行MessageConsumer类,接收消息。

你应该会看到类似以下的输出:

Producer Output:

 [x] Sent 'Hello World!'

Consumer Output:

 [*] Waiting for messages. To exit press CTRL+C[x] Received 'Hello World!'

7. 总结

通过以上步骤,我们成功地在RabbitMQ中实现了点对点通讯。消息生产者将消息发送到队列,而消息消费者从队列中接收消息。这种模式非常适合需要确保消息只被一个消费者处理一次的场景。

相关文章:

RabbitMQ中点对点(Point-to-Point)通讯方式的Java实现

RabbitMQ是一个广泛使用的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。RabbitMQ支持多种消息传递模式&#xff0c;其中最基本的是点对点&#xff08;Point-to-Point&#xff09;通讯方式。在这种模式下&#xff0c;消息生产者将消息发…...

爬虫实战:获取1688接口数据全攻略

引言 在电商领域&#xff0c;数据的重要性不言而喻。1688作为中国领先的B2B电商平台&#xff0c;提供了海量的商品数据。通过爬虫技术获取这些数据&#xff0c;可以帮助企业进行市场分析、价格监控和供应链管理。本文将详细介绍如何使用Python爬虫技术合法合规地获取1688接口数…...

生成树协议STP工作步骤

第一步&#xff1a;选择根桥 优先级比较&#xff1a;首先比较优先级&#xff0c;优先级值越小的是根桥MAC地址比较&#xff1a;如果优先级相同&#xff0c;则比较MAC地址。MAC地址小的是根桥。 MAC地址比较的时候从左往右&#xff0c;一位一位去比 第二步&#xff1a;所有非根…...

Android14 AOSP支持短按关机

修改frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java diff --git a/base/services/core/java/com/android/server/policy/PhoneWindowManager.java b/base/services/core/java/com/android/server/policy/PhoneWindowManager.java in…...

C# 和 go 关于can通信得 整理

在C#中开发CAN&#xff08;Controller Area Network&#xff09;通信接口时&#xff0c;确实有一些现成的NuGet包可以简化你的开发工作。这些库通常提供了与CAN硬件接口通信所需的基本功能&#xff0c;如发送和接收CAN消息。下面是一些常用的NuGet包&#xff1a; PCANBasic.NET…...

vue常用命令汇总

nvm 一个nodejs版本管理工具&#xff0c;解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js。 npm 可以管理 nodejs 的第三方插件。 vue-cli 是Vue提供的一个官方cli,专门为单页面应用快速搭建繁杂的脚手架。 nginx 是一个高性能的HTTP和反向代理we…...

【C++习题】18.逆波兰表达式求值

题目&#xff1a;逆波兰表达式求值 链接&#x1f517;&#xff1a;逆波兰表达式求值 题目&#xff1a; 代码&#xff1a; class Solution {public:int evalRPN(vector<string>& tokens) {stack<int> s;for (size_t i 0; i < tokens.size(); i){string&a…...

本地如何使用 yarn link 调试本地 npm 包

如何使用 yarn link 调试本地 npm 包&#xff1a; 在前端开发中&#xff0c;通常我们会开发并使用许多 npm 包来实现项目的功能。随着开发的深入&#xff0c;我们经常需要调试或修改某些 npm 包的源码。如果你正在开发一个 npm 包&#xff0c;并且希望在本地项目中进行调试&am…...

江恩45年一书的自己一点读书见解

读了下江恩的华尔街45年&#xff0c;有些浅薄的体会&#xff0c;记录下 江恩的华尔街45年里面&#xff0c;感触比较深刻的有以下几点&#xff1a; 1.为什么会亏钱 1.利用大仓位来过度交易&#xff0c;违背了资本安全的原则。买卖过于频繁 2.没有用止损单来保护你的交易。 3.缺…...

影响 Linux、Unix 系统的 CUPS 漏洞可导致 RCE

在经过大量炒作和第三方过早泄露信息之后&#xff0c;安全研究员 Simone Margaritelli 公布了有关通用 UNIX 打印系统 (CUPS) 中的四个零日漏洞的详细信息。 这些漏洞可被远程、未经身份验证的攻击者滥用&#xff0c;在易受攻击的 Linux 和类 Unix 系统上实现代码执行。 CUPS…...

【汇编】思考汇编中的两个基本问题

1. 若干年前的疑问 几年前还在大学学习汇编时&#xff0c;不管是考试还是课程设计&#xff0c;其实都很顺利。但是心里一直对什么时候使用哪个寄存器存在疑惑&#xff0c;编写汇编时&#xff0c;没有十足的把握&#xff0c;都是抱着试一试的心态去完成了课程任务。 工作八年有…...

Nest Dynamic modules 笔记

Nest Dynamic modules 文档地址&#x1f448; 记录Dynamic modules是因为确实抽象&#xff0c;文档并没有很详细的指出不同方式创建动态模块的区别 两种不同的动态模块创建方式 静态模块传统动态模块方式实现三种不同的方法命名使用ConfigurableModuleBuilder异步动态模块如果…...

生成式AI、大模型、多模态技术开发与应用学习清单

学习目的&#xff1a; 了解AIGC发展现状与核心技术。 掌握Transformer核心开发技术。掌握向量数据库的工作原理、检索算法、主要开源数据库。掌握大模型调用、微调方法。掌握以GPT大语言模型为基础的工作原理。 掌握AIGC技术在跨模态领域的应用技术。了解GPT提示工程和AIGC的安…...

STM32 CubeMx HAL库 独立看门狗IWDG配置使用

看门狗这里我就不多介绍了&#xff0c;能搜到这篇文章说明你了解 总之就是一个单片机重启程序&#xff0c;设定好超时时间&#xff0c;在超时时间内没有喂狗&#xff0c;单片机就会复位 主要应用在单片机异常重启方面&#xff0c;比如程序跑飞&#xff08;注意程序跑飞时你就…...

网络安全渗透测试概论

渗透测试&#xff0c;也称为渗透攻击测试是一种通过模拟恶意攻击者的手段来评估计算机系统、网络或应用程序安全性的方法。 目的 旨在主动发现系统中可能存在的安全漏洞、脆弱点以及潜在风险&#xff0c;以便在被真正的恶意攻击者利用之前&#xff0c;及时进行修复和加固&…...

【大数据技术基础】【记录Ubuntu 16.04升级到18.04】Ubuntu的一个版本升级到另一个版本

在 Ubuntu 操作系统中进行软件更新和系统升级 Ubuntu Kylin 16.04 LTS 系统进行系统升级到 Ubuntu 18.04.6 LTS 版本 升级提示&#xff1a;系统弹出提示框&#xff0c;告知用户有新版本的 Ubuntu 可用&#xff0c;询问用户是否想要升级。 认证窗口&#xff1a;显示了一个认证…...

知识库系统,集成neo4j,集成activiti工作流,集成es全文检索,知识图谱血缘关系,nlp知识库

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 为什么建立知识库平台&#xff1f; 助力企业…...

批量合并多个Excel到一个文件

工作中&#xff0c;我们经常需要将多个Excel的数据进行合并&#xff0c;很多插件都可以做这个功能。但是今天我们将介绍一个完全免费的独立软件【非插件】&#xff0c;来更加方便的实现这个功能。 准备Excel 这里我们准备了两张待合并的Excel文件 的卢易表 打开的卢易表软件…...

CNCF云原生生态版图-项目和产品综合分析

CNCF云原生生态版图-项目和产品综合分析 CNCF云原生生态版图-项目和产品综合分析整体统计分析中国研发人员贡献项目和产品其中&#xff0c;纳入 CNCF 管理的开源项目 链接 CNCF云原生生态版图-项目和产品综合分析 整体统计分析 在对云原生技术选型时&#xff0c;优先选择经过 …...

MySQL生产环境备份脚本

全量备份脚本&#xff0c;其中BakDir&#xff0c;ZlbakDir&#xff0c;LogFile需要自己创建 #!/bin/bash export LANGen_US.UTF-8# 指定备份目录 BakDir/root/beifen/data/mysqlbak/data/allbak # 指定增量备份目录 ZlbakDir/root/beifen/data/mysqlbak/data/zlbak # 备份日志…...

leetcode 3224. 使差值相等的最少数组改动次数

题目链接&#xff1a;3224. 使差值相等的最少数组改动次数 题目&#xff1a; 给你一个长度为 n 的整数数组 nums &#xff0c;n 是偶数 &#xff0c;同时给你一个整数 k 。 你可以对数组进行一些操作。每次操作中&#xff0c;你可以将数组中任一元素替换为 0 到 k 之间的任一…...

多线程动态库里面调用静态库分配内存函数导致的崩溃cltp汇编指令导致

1、概述 有这样的一个场景,我有一个动态库myso.so里面有函数start_crash()&#xff0c;用到静态库的内存分配函数&#xff0c;其实静态库里面的static.a 里面就封装了一个函数叫system_malloc(),函数返回的是分配的内存地址&#xff0c;然后发现&#xff0c;我在测试demo里面创…...

力扣刷题TOP101: 31.BM38 在二叉树中找到两个节点的最近公共祖先

目录&#xff1a; 目的 思路 复杂度 记忆秘诀 python代码 目的&#xff1a; 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2&#xff0c;请找o1 和 o2 的最近公共祖先节点。 思路 这个任务目和上一题在二叉搜索树中找到两个节点的最近公共祖先有点类…...

前端项目打包部署

打包和部署前端项目是将开发环境中的代码转化为生产环境可直接运行的静态文件&#xff0c;并将其部署到服务器上的过程。 # 项目打包 pnpm run build# 上传文件至远程服务器 将本地打包生成的 dist 目录下的所有文件拷贝至服务器的 /usr/share/nginx/html 目录。# nginx.cofig…...

《CSS 知识点》大屏卡片布局思路:弹性布局 flex-grow

思路 大屏左右两侧高宽一致&#xff0c;内部卡片可按比例设置&#xff01; 使用弹性布局和属性 flex-grow 设置比例&#xff1b;间隔使用 margin-bottom 设置&#xff0c;最后一个卡片不设置&#xff1b; 效果如图 代码说明 CSS代码 26 - 30&#xff0c;左右两侧设置弹性布…...

nVisual 登录页页面配置说明

一、概述 nVisual登录页面可根据具体客户需要通过public\config\access.js文件进行自定义配置。页面可以大致分为4个部分&#xff0c;头部、底部、可移动区域以及页面中间的信息填写区域。其中头部和底部又包含头部左侧、头部中间、头部右侧、底部左侧、底部中间、底部右侧六个…...

后端接受前端传递数组进行批量删除

问题描述&#xff1a;当我们需要做批量删除功能的时候&#xff0c;我们循环单次删除的接口也能进行批量删除&#xff0c;但要删除100条数据就要调用100次接口&#xff0c;或者执行100次sql&#xff0c;这样系统开销是比较大的&#xff0c;那么我们直接采用接收的数组格式数据sq…...

拍频实例 - 一组恒力矩电流采样数据

这是一组功率电机的感应电流波形。加载了重载恒力矩设备。你能看到什么&#xff1f; 首先&#xff0c;时间轴的坐标是对的&#xff0c;9.9~10.0秒&#xff0c;单位是秒&#xff0c;100ms有5个波形&#xff0c;所以是20ms一个波形。这是50Hz的信号。频差就体现为幅度的周期起伏…...

Jvm之NativeMemoryTracking 使用

开启 Native Memory Tracking 通过 -XX:NativeMemoryTracking 开启&#xff1a; -XX:NativeMemoryTrackingoff:这是默认值&#xff0c;即关闭 Native Memory Tracking -XX:NativeMemoryTrackingsummary: 开启 Native Memory Tracking&#xff0c;但是仅仅按照各个 JVM 子系统…...

PKCS#7、Bit padding(位填充)、Byte padding(字节填充)、Zero padding(零填充)

PKCS#7、Bit padding&#xff08;位填充&#xff09;、Byte padding&#xff08;字节填充&#xff09;、Zero padding&#xff08;零填充&#xff09;是密码学常见的填充方式。 Bit padding&#xff08;位填充&#xff09;&#xff1a; 位填充可以应用于任意长度的消息。在消息…...