RabbitMQ的用户详解以及maven导入

news/2025/3/25 9:03:25/文章来源:https://www.cnblogs.com/5ran2yl/p/18788013

一.RabbitMQ的角色分类

1:none:

  • 不能访问management plugin

2:management:查看自己相关节点信息

  • 列出自己可以通过AMQP登入的虚拟机
  • 查看自己的虚拟机节点 virtual hosts的queues,exchanges和bindings信息
  • 查看和关闭自己的channels和connections
  • 查看有关自己的虚拟机节点virtual hosts的统计信息。包括其他用户在这个节点virtual hosts中的活动信息。

3:Policymaker

  • 包含management所有权限
  • 查看和创建和删除自己的virtual hosts所属的policies和parameters信息。

4:Monitoring

  • 包含management所有权限
  • 罗列出所有的virtual hosts,包括不能登录的virtual hosts。
  • 查看其他用户的connections和channels信息
  • 查看节点级别的数据如clustering和memory使用情况
  • 查看所有的virtual hosts的全局统计信息。

5:Administrator

  • 最高权限
  • 可以创建和删除virtual hosts
  • 可以查看,创建和删除users
  • 查看创建permisssions
  • 关闭所有用户的connections

二.RabbitMQ入门案例 - Simple 简单模式

环境需要

1:jdk1.8
2:构建一个maven工程
3:导入rabbitmq的maven依赖
4:启动rabbitmq-server服务
5:定义生产者
6:定义消费者
7:观察消息的在rabbitmq-server服务中的过程

简单模式

在 RabbitMQ 中,Simple 模式(也称为简单模式或直接模式)是最基础的消息传递模式之一。它适用于一对一的消息传递场景,即一个生产者发送消息到队列,一个消费者从队列中接收并处理消息。
生产者 (Producer):
生产者负责创建消息,并将消息发送到指定的队列。它不关心谁会消费这些消息,只是将消息推送到队列中。
队列 (Queue):
队列是 RabbitMQ 中的核心组件,用于存储消息。在 Simple 模式下,通常只有一个队列,所有的消息都会被发送到这个队列中。
消费者 (Consumer):
消费者从队列中拉取消息并进行处理。在 Simple 模式下,通常只有一个消费者,所有消息都会被这个消费者逐一处理。
消息 (Message):
消息是由生产者生成的内容,可以是文本、JSON 数据、二进制数据等。消息会被发送到队列中,等待消费者消费。

 简单入门案例

在Idea中新建一个maven项目

 导入相关的依赖:Java原生依赖

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

rabbitmq和spring同属一个公司开放的产品,所以他们的支持也是非常完善,这也是为什么推荐使用rabbitmq的一个原因。

启动RabbitMQ服务:

systemctl start rabbitmq-server

 

 定义生产者:也就是产生消息的对象,需要把生成的消息交给RabbitMQ的队列中

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Producer {public static void main(String[] args) {//创建连接工厂ConnectionFactory factory = new ConnectionFactory();//设置连接参数factory.setHost("8.137.76.12");factory.setPort(5672);factory.setVirtualHost("/");factory.setUsername("admin");factory.setPassword("admin");//声明连接和通道Connection connection = null;Channel channel = null;try {//创建连接connection = factory.newConnection("生产者");//创建通道channel = connection.createChannel();//声明队列// 5: 申明队列queue存储消息/**  如果队列不存在,则会创建*  Rabbitmq不允许创建两个相同的队列名称,否则会报错。**  @params1: queue 队列的名称*  @params2: durable 队列是否持久化*  @params3: exclusive 是否排他,即是否私有的,如果为true,会对当前队列加锁,其他的通道不能访问,并且连接自动关闭*  @params4: autoDelete 是否自动删除,当最后一个消费者断开连接之后是否自动删除消息。*  @params5: arguments 可以设置队列附加参数,设置队列的有效期,消息的最大长度,队列的消息生命周期等等。* */channel.queueDeclare("queue1",false,false,false,null);//发送消息// 7: 发送消息给中间件rabbitmq-server// @params1: 交换机exchange// @params2: 队列名称/routing// @params3: 属性配置// @params4: 发送消息的内容channel.basicPublish("","queue1",null,"hello,i am ok".getBytes());System.out.println("信息发送成功");}catch (Exception e){e.printStackTrace();System.out.println("发送消息异常");}finally {//关闭连接--通道if (channel !=null && channel.isOpen()){try {channel.close();}catch (Exception e){System.out.println("关闭通道异常");}}//关闭连接if (connection != null){try {connection.close();}catch (Exception e){System.out.println("关闭连接失败");}}}}
}

 

执行发送之后,可以使用RabbitMQ的web管理查看通道是否接收到消息:

 定义消费者从通道中拿取信息:

import com.rabbitmq.client.*;import java.io.IOException;public class Consumer {public static void main(String[] args) {//创建连接工厂ConnectionFactory factory = new ConnectionFactory();//设置连接参数factory.setHost("8.137.76.12");factory.setPort(5672);factory.setVirtualHost("/");factory.setUsername("admin");factory.setPassword("admin");//声明连接和通道Connection connection = null;Channel channel = null;try {//创建连接connection = factory.newConnection("消费者");//创建通道channel = connection.createChannel();//接收信息// 监听队列,当有消息到达时,执行回调函数channel.basicConsume("queue1", true, new DeliverCallback() {// 当有消息到达时,执行回调函数
                @Overridepublic void handle(String s, Delivery delivery) throws IOException {// 打印接收到的消息System.out.println("接收到的消息是:" + new String(delivery.getBody(), "UTF8"));}}, new CancelCallback() {// 当接收失败时,执行回调函数
                @Overridepublic void handle(String s) throws IOException {// 打印接收失败的信息System.out.println("接收失败了");}});System.out.println("开始接收消息");System.in.read();}catch (Exception e){e.printStackTrace();System.out.println("发送消息异常");}finally {//关闭连接--通道if (channel !=null && channel.isOpen()){try {channel.close();}catch (Exception e){System.out.println("关闭通道异常");}}//关闭连接if (connection != null){try {connection.close();}catch (Exception e){System.out.println("关闭连接失败");}}}}
}

 

当消息接收之后,我们暂停程序,也就是不释放连接:

 我们发现消息队列中就没有消息了

然后释放连接:

 没有持久化的队列消失了

三.什么是AMQP

AMQP,全称为高级消息队列协议(Advanced Message Queuing Protocol),是一种开放的、面向消息中间件的线级协议。它由JPMorgan Chase和iMatix公司设计开发,并于2008年首次发布。AMQP旨在提供一种统一的消息传递协议,使得不同的消息中间件产品之间能够实现互操作性。

AMQP的核心概念

  1. Exchange(交换机):接收生产者发送的消息,并根据一定的路由规则将这些消息分发到一个或多个队列中。

  2. Queue(队列):存储消息的地方,消费者从这里获取并处理消息。

  3. Binding(绑定):定义了Exchange与Queue之间的关系,即通过何种规则将消息从Exchange路由到特定的Queue。

  4. Routing Key(路由键):一个虚拟地址,通常是一个简单的字符串,用于Exchange决定如何路由消息。

  5. Message(消息):应用程序之间需要通过消息代理(如RabbitMQ)进行传递的数据内容。

AMQP的工作流程

  1. 生产者(Producer)连接到RabbitMQ服务器,并声明一个交换机(Exchange)。
  2. 生产者发送消息给交换机,同时指定一个路由键(Routing Key)。
  3. 交换机根据其类型和绑定规则(Bindings)将消息路由到一个或多个队列(Queue)。
  4. 消费者(Consumer)监听特定的队列,并处理传入的消息。

生产者:

 消费者:

 

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

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

相关文章

第四周第三章3.1—3.5

3.1 initial_weight = 50 print("年份\t地球体重(kg)\t月球体重(kg)") for year in range(1, 11): earth_weight = initial_weight + (year - 1) * 0.5 moon_weight = earth_weight * 0.165 print(f"{year}\t\t{earth_weight:.2f}\t\t{moon_weight:.2f}")3…

PolarCTF网络安全2025春季个人挑战赛 WRITE UP

1-1 可老师签到 本题思路如下: 提示“发送的内容为双写字符串拼接”公众号发送flagflag即可1-2 find 本题思路如下: 把表格文件当压缩包解压,找到flag.xlsx\xl\worksheets\sheet1.xml 发现里面存了数据,于是考虑把数据格子上色以得到flag 先将xml文件处理以获得纯数据代码:…

Go红队开发—CLI框架(一)

CLI命令行工具编写基础学习(一)。CLI开发框架 命令行工具开发,主要是介绍开发用到的包,集成了一个框架,只要学会了基本每个人都能开发安全工具了。 该文章先学flags包,是比较经典的一个包,相比后面要学习的集成框架这个比较自由比较细化点,自定义可能高一些,后续会学到一…

WSL2安装Ubuntu

本文是介绍如何使用任意一台Windows主机借助WSL2创建Ubuntu虚拟系统并开放局域网内SSH连接的操作指南!先决条件拥有能够访问github.com的网络环境; 必须运行 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11版本;安装WSL2 以管理员身份运行Powe…

人工‘够好就行’智能(AGEI)就快来了!

比尔弗兰克斯 前言:本文作者的观点是在真正的通用人工智能(AGI)到来之前,一种“够好就行”的人工智能(AGEI)就已经足以引发我们原本担心 AGI 才会带来的重大社会变革、正面效益,甚至潜在危机。 换句话说: AI 不需要达到像人类一样全面智能的程度; 只要在足够多的任务上…

List集合--java进阶day09

1.List集合以下面的例子来解释存储有序和存储重复如上图,我们是怎么添加这些字符串的,打印的时候就是按照这个顺序打印的--存取有序 并且“张三”出现了两次,也存入了两次--存储重复 因为List有索引,所以该接口有关于索引的独特的api..1.remove注意事项 List有两个remove方…

Pydantic字段级校验:解锁@validator的12种应用

title: Pydantic字段级校验:解锁@validator的12种应用 date: 2025/3/23 updated: 2025/3/23 author: cmdragon excerpt: Pydantic校验系统支持通过pre验证器实现原始数据预处理,在类型转换前完成字符清洗等操作。格式验证涵盖正则表达式匹配与枚举值约束,确保护照编号等字…

20244126 2024-2025-2 《python程序设计》实验一报告

课程:《Python程序设计》 班级:2441 姓名:马晓霞 学号:20244126 实验教师:王志强 实验日期:2025年3月23日 必修/选修:公选课 (一)实验内容 1.熟悉Python开发环境 2.练习Python运行,调试技能 3.编写技能,练习变量和类型、字符串、对象、缩进和注释等 4.编写一个猜数字…

1.6K star!这个开源文本提取神器,5分钟搞定PDF/图片/Office文档!

Kreuzberg 是一个基于 Python 的文本提取库,支持从 PDF、图像、Office 文档等 20+ 格式中提取文本内容。采用 MIT 开源协议,具备本地处理、异步架构、智能 OCR 等特性,特别适合需要隐私保护的文档处理场景。嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开…

leetcode每日一题:判断一个括号字符串是否有效

题目 一个括号字符串是只由 ( 和 ) 组成的 非空 字符串。如果一个字符串满足下面 任意 一个条件,那么它就是有效的:字符串为 (). 它可以表示为 AB(A 与 B 连接),其中A 和 B 都是有效括号字符串。 它可以表示为 (A) ,其中 A 是一个有效括号字符串。给你一个括号字符串 s 和…

实验2c语言分支与循环基础应用编程

任务一:1 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>4 5 #define N 56 7 int main() {8 int number;9 int i; 10 11 srand(time(0)); // 以当前系统时间作为随机种子 12 for(i = 0; i < N; ++i) { 13 nu…

矿用人员违规闯入监控报警系统

矿用人员违规闯入监控报警系统,设置警戒预警功能,巷道正在行车时,当有行人闯入时,及时抓拍、识别现场违章入侵人员同时闪光警示和音箱报警提示禁止进入,在绞车运行期间人员误入斜巷能够及时报警,自动停止绞车运行。该系统做到绞车运行和行人的安全隔离,有力保障了煤矿斜…