RabbitMQ入门实战

文章目录

  • RabbitMQ入门实战
    • 基本概念
    • 安装
    • 快速入门
      • 单向发送
      • 多消费者

RabbitMQ入门实战

官方:https://www.rabbitmq.com

基本概念

AMQP协议:https://www.rabbitmq.com/tutorials/amqp-concepts.html
定义:高级信息队列协议(Advanced Message Queue Protocol)
生产者:发消息到某个交换机
消费者:从某个队列中取信息
交换机(Exchange):负责把消息转发到对应的队列
队列(Queue):存储消息
路由(Routes):将消息从一个地方转发到另一个地方
AMQP模型
image.png

安装

windows 安装:https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.12.0image.png
安装 erlang 25.3.2(因为 RabbitMQ 依赖 erlang,不安装这个安装RabbitMQ会报错),这个语言的性能非常高。
erlang 下载:https://www.erlang.org/patches/otp-25.3.2
image.png
安装完 erlang 后,安装 rabbitmq 即可。
win + r 打开 services.msc(服务菜单),查看 rabbitmq 服务是否已启动:


安装 rabbitmq 监控面板:
在 rabbitmq 安装目录的 sbin 中执行下述脚本:
D:\software\rabbitmq\rabbitmq_server-3.12.0\sbin

rabbitmq-plugins.bat enable rabbitmq_management

image.png
访问:http://localhost:15672,用户名密码都是 guest:
image.png
如果想要在远程服务器安装访问 rabbitmq 管理面板,你要自己创建一个管理员账号,不能用默认的 guest,否则会被拦截(官方出于安全考虑)。

如果被拦截,可以自己创建管理员用户:
参考文档的 Adding a User:https://www.rabbitmq.com/access-control.html

rabbitmq 端口占用:
5672:程序连接的端口
15672:webUI

快速入门

单向发送

一个生产者给一个队列发消息,一个消费者从这个队列取消息,一对一

引入消息队列 Java 客户端:

<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.17.0</version>
</dependency>

生产者代码:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.nio.charset.StandardCharsets;public class Send {private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);String message = "Hello World!";channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));System.out.println(" [x] Sent '" + message + "'");}}
}

Channel频道:理解为操作消息队列的client,提供了和消息队列server建立通信的方法(为了复用连接,提高传输效率)。程序通过channel操作rabbitmq
创建消息队列:
参数:
queueName:消息队列名称(注意,同名称的消息队列,只能用同样的参数创建一次)
durabale:消息队列重启后,消息是否丢失
exclusive:是否只允许当前这个创建消息队列的连接操作消息队列
autoDelete:没有人用队列后,是否要删除队列
执行程序后,可以看到有 1 条消息:

消费者代码:

public class SingleConsumer {private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {// 创建连接ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 创建队列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(), StandardCharsets.UTF_8);System.out.println(" [x] Received '" + message + "'");};// 消费消息,会持续阻塞channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });}
}

启动消费者后,可以看到消息被消费了

多消费者

官方教程:https://www.rabbitmq.com/tutorials/tutorial-two-java.html
场景:多个机器同时去接受并处理任务(尤其是每个机器的处理能力有限)
一个生产者给一个队列发消息,多个消费者从这个队列中取消息

1)队列持久化
durable参数设置为true,服务器重启后队列不丢失:

channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);

2)消息持久化
指定MessageProperties.PERSISTENT_TEXT_PLAIN 参数:

channel.basicPublish("", TASK_QUEUE_NAME,MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes("UTF-8"));

生产者代码:

package com.yupi.springbootinit.mq;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;import java.util.Scanner;public class MultiProducer {//队列名字private static final String TASK_QUEUE_NAME = "multi_queue";public static void main(String[] argv) throws Exception {//建立连接ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {//创建队列channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {String message = scanner.nextLine();//在指定的交换机上发布消息到TASK_QUEUE_NAME的队列中,使用 MessageProperties.PERSISTENT_TEXT_PLAIN将消息标为持久化,最后将消息体转换为字节数组channel.basicPublish("", TASK_QUEUE_NAME,MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes("UTF-8"));System.out.println(" [x] Sent '" + message + "'");}}}}

消费者代码:

package com.yupi.springbootinit.mq;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;public class MultiConsumer {private static final String TASK_QUEUE_NAME = "multi_queue";public static void main(String[] argv) throws Exception {// 建立连接ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");final Connection connection = factory.newConnection();for (int i = 0; i < 2; i++) {final Channel channel = connection.createChannel();channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");//消费者每次只能处理一个消息channel.basicQos(1);// 定义了如何处理消息int finalI = i;// 创建消息接收回调函数,以便接收消息DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");try {// 处理工作System.out.println(" [x] Received '" + "编号:" + finalI + ":" + message + "'");// 停 20 秒,模拟机器处理能力有限Thread.sleep(20000);} catch (InterruptedException e) {e.printStackTrace();} finally {System.out.println(" [x] Done");// 手动发送应答,告诉RabbitMQ消息已经被处理channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);}};// 开始消费消息,传入队列名称,是否自动确认,投递回调和消费者取消回调channel.basicConsume(TASK_QUEUE_NAME, false, deliverCallback, consumerTag -> {});}}
}

这样你就可以跑通你的第一个RabbitMQ并且了解了单向发送和多消费者两种方式,下期分享RabbitMQ一个重要的概念—交换机

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

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

相关文章

让流程图动起来

我们平时画流程&#xff0c;然后贴到文档&#xff0c;就完事了。但是过程演示的时候&#xff0c;如果只是一张静态图&#xff0c;很难吸引到听众的注意力&#xff0c;表达效果并不太好。常用的方法是可以用PPT进行动态演示&#xff0c;做PPT也是需要花一些时间&#xff0c;同时…

7、OpenCompass 大模型评测实战

0、为什么要研究大模型的评测&#xff1f; 首先&#xff0c;研究评测对于我们全面了解大型语言模型的优势和限制至关重要。尽管许多研究表明大型语言模型在多个通用任务上已经达到或超越了人类水平&#xff0c;但仍然存在质疑&#xff0c;即这些模型的能力是否只是对训练数据的…

【数据结构(邓俊辉)学习笔记】向量01——接口与实现

文章目录 0.意图1、概述2 从数组到向量3 向量ADT接口4 Vector 模板类5 构造与析构5.1默认构造方法5.2基于复制的构造方法5.3 析构方法 0.意图 一方面是将工作学习中零星的知识点串起来&#xff0c;另一方面向量是其他数据类型的基础&#xff0c;比如栈队列等&#xff0c;所以基…

分享4张亚马逊云科技AWS免费云开发和AI证书(有答案)

今天给大家带来特别福利&#xff0c;一口气带来亚马逊云科技AWS4张免费云开发/AI证书(有Credly徽章&#xff0c;有答案)&#xff0c;这四门都是云开发相关的硬核知识&#xff0c;含金量极高。 主要考察如何用AWS AI服务进行开发、以及当下热门的云原生改造&#xff0c;16道题80…

Skill Check: Build an LLM Application using OCI Generative AI Service

Skill Check: Build an LLM Application using OCI Generative AI Service

基于模糊控制的电动汽车锂电池SOC主动均衡电路MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 模型在 Matlab/Simulink仿真平台中搭建16节电芯锂电池电路模型&#xff0c;主要针对电动车锂电池组SOC差异性&#xff0c;采用模糊控制算法动态调节均衡电流&#xff0c;以减少均衡时间和能量损耗。…

Python全栈开发前端与后端的完美融合

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在当今互联网时代&#xff0c;全栈开发已经成为了一种趋势。全栈开发者具备前端和后端开发的…

java Web-Spring AOP

AOP的概念 AOP:面向切面编程&#xff0c;面向方法编程。简单理解就是对特定方法的扩充的思想 例如我们要在特定方法进行方法的执行时间判断&#xff0c;我们假如去使用在每个方法去进行业务逻辑扩充&#xff0c;这样就太繁琐了&#xff0c;而使用AOP就可以简化操作。Spring A…

Pytorch 学习路程 - 1:入门

目录 下载Pytorch 入门尝试 几种常见的Tensor Scalar Vector Matrix AutoGrad机制 线性回归尝试 使用hub模块 Pytorch是重要的人工智能深度学习框架。既然已经点进来&#xff0c;我们就详细的介绍一下啥是Pytorch PyTorch 希望将其代替 Numpy 来利用 GPUs 的威力&…

.net6项目模板搭建教程

1.集成log4net 安装如下扩展依赖即可&#xff0c;已经包含了log4net依赖&#xff1a; Microsoft.Extensions.Logging.Log4Net.AspNetCore 添加日志配置文件&#xff1a; 日志配置文件属性设置为始终复制&#xff1a; 注入服务&#xff1a; #region 注入log4net日志服务build…

一年期免费SSL证书正在消失?这里还有

在数字化时代&#xff0c;数据安全与隐私保护的重要性不言而喻。SSL&#xff08;Secure Sockets Layer&#xff09;证书作为保障互联网通信安全的关键工具&#xff0c;其有效期一直是业界关注的焦点。近年来&#xff0c;我们见证了免费一年期SSL证书向三个月有效期的转变&#…

win11右键默认显示更多选项

目录 方法一&#xff1a;使用 Shift 键加右键单击方法二&#xff1a;修改注册表方法三&#xff1a;运行命令重启打开命令行恢复win10右键恢复win11右键 在 Windows 11 中&#xff0c;右键单击某个文件或文件夹时&#xff0c;默认情况下可能会显示较少的选项。如果您希望在右键菜…

Oracle EBS Interface/API(54)- GL日记账审批

背景: 客户化创建薪酬凭证或者银企付款入账日记账以后,用户希望自动提交审批流程,无需到系统标准功能点击审批,减少用户操作。 快速参考 参考点内容功能导航N: GL->日记账->输入并发请求None基表GL.GL_JE_BATCHESAPI参考下面介绍错误信息表None接口FormNone接口Reque…

相机标定的原理

1.相机标定资料 这个视频是建议有一定基础的去看&#xff0c;详细介绍了整个标定的过程。 https://www.bilibili.com/video/BV1R7411m7ZQ/?spm_id_from333.337.search-card.all.click&vd_sourcec205d4d10f730a57820343328741984a 这个文章基础一点&#xff0c;可以先看 h…

【YOLOv8改进[注意力]】YOLOv8添加DAT(Vision Transformer with Deformable Attention)助力涨点

目录 一 DAT 二 YOLOv8添加DAT助力涨点 1 总体修改 2 配置文件 3 训练 其他 一 DAT 官方论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2022/papers/Xia_Vision_Transformer_With_Deformable_Attention_CVPR_2022_paper.pdf Transformers最近在各种视…

轻松搭建llama3Web 交互界面 - Ollama + Open WebUI

Ubuntu下安装&#xff1a;&#xff08;官网&#xff1a;Download Ollama on Linux&#xff09; curl -fsSL https://ollama.com/install.sh | sh 就运行起来ollama了&#xff0c;不放心可以用ollama serve查看一下 ollama run llama3 就可以跑起来了&#xff0c; 那么我们肯…

windows10环境下conda迁移到linux环境

网上给出的方案错误百出&#xff0c;记录一下正确方案。 1 创建yaml文件 创建到终端所在路径下 conda activate 环境名 conda env export --no-build >环境名.yaml2 新操作系统中创建新的conda环境 conda env create -f 环境名.yaml3 删除不兼容的包 终端报错 Could n…

CUDA编程【2】-(51-78)

系列文章目录 文章目录 系列文章目录前言51、寄存器溢出51.1 溢出概念51.1 使用控制 52、本地内存和共享内存52.1 本地内存52.2. 共享内存 53. 常量内存53.1 概念53.2 初始化 54. 全局内存54.1 概念54.2 初始化 55. GPU缓存和变量作用域55.1 缓存类型55.2 变量作用域 56. 静态全…

我的一些 35+ 前同事的现状

大家好&#xff0c;我是坤哥&#xff0c;好久不见&#xff0c;今天简单和大家聊一下我目前观察到的前同事的现状 今年和一些前同事简单聊过&#xff0c;他们的现状如下&#xff1a; A: 去新西兰做 iOS 开发快 10 年了&#xff0c;马上就要拿到永久居留证了&#xff0c;他说在新…

(六)小案例银行家应用程序-删除账号-findindex方法

findindex方法和find方法非常类似&#xff0c;只不过findindex顾名思义&#xff0c;他返回的是index&#xff1b; ● 下面我们使用删除账号的功能来学习一下findindex的 ● 当用户登录成功之后&#xff0c;可以在下方输入自己的用户名和密码&#xff0c;然后提交&#xff0c…